Template class with template function
有人能说出这段代码有什么问题吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | template<class X> class C { public: template<class Y> void f(Y); // line 4 }; template<class X, class Y> void C<X>::f(Y y) { // line 8 // Something. } int main() { C<int> c; char a = 'a'; c.f(a); return 0; } |
编译:
1 2 3 | $ g++ source.cpp source.cpp:8: error: prototype for ‘void C<X>::f(Y)’ does not match any in class ‘C<X>’ source.cpp:4: error: candidate is: template<class X> template<class Y> void C::f(Y) |
我现在可以通过在第4行声明和定义函数来完成任务,但是与单独声明和定义函数相比,同时声明和定义函数会有什么后果呢?(这不是关于在头文件与源文件之间声明函数的讨论)
注:我已经看到这个问题,但似乎唯一让我感兴趣的部分被分开了。=(
编译器已经告诉你答案了。类
1 2 3 4 5 6 | template <class X> template <class Y> void C<X>::f(Y y) { // Something. } |
如果您在声明站点定义函数,那么您将隐式地声明它
正如您正确地观察到的,您仍然需要在头文件中提供定义,因为您需要在每次使用模板时实例化模板,因此需要访问所有定义。
错误确切地告诉您,您的代码应该如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | template<class X> class C { public: template<class Y> void f(Y); // line 4 }; template<class X> template<class Y> void C<X>::f(Y y) { // line 8 // Something. } int main() { C<int> c; char a = 'a'; c.f(a); return 0; } |
您的类没有定义为
另外,最好在模板参数列表中使用关键字"typename"而不是"class"。