解决方法
虚拟成员函数在实例化类模板时被实例化,但非虚拟成员函数只有在被调用时被实例化.
这在C标准的第14.7节中有所描述.
还要注意,即使某些成员函数对于给定的模板参数不可实例化,也可以实例化一个类模板.例如:
template <class T> class Xyzzy { public: void CallFoo() { t.foo(); } // Invoke T::foo() void CallBar() { t.bar(); } // Invoke T::bar() private: T t; }; class FooBar { public: void foo() { ... } void bar() { ... } }; class BarOnly { public: void bar() { ... } }; int main(int argc,const char** argv) { Xyzzy<FooBar> foobar; // Xyzzy<FooBar> is instantiated Xyzzy<BarOnly> baronly; // Xyzzy<BarOnly> is instantiated foobar.CallFoo(); // Calls FooBar::foo() foobar.CallBar(); // Calls FooBar::bar() baronly.CallBar(); // Calls BarOnly::bar() return 0; }
这是有效的,即使Xyzzy :: CallFoo()不可实例化,因为没有像BarOnly :: foo()这样的东西.此功能经常用作模板元编程工具.