Out-of-class 专用内部class 模板函数的定义?
Out-of-class definition of function of specialized inner class template?
请考虑以下格式错误的程序:
struct S {
template<class T> struct J { };
};
template<>
struct S::J<void> {
void f();
};
template<>
void S::J<void>::f() {} // ERROR
$ clang++ -std=c++11 test.cpp
no function template matches function template specialization 'f'
$ g++ -std=c++11 test.cpp
template-id ‘f<>’ for ‘void S::J<void>::f()’ does not match any template declaration
为什么 f
的定义不能编译?如何在上面正确定义函数f
?
clang 错误在这里很有用:
no function template matches function template specialization 'f'
// ^^^^^^^^^^^^^^^^^
您使用的语法适用于函数模板。但是 f
不是函数模板,它只是一个函数。要定义它,我们不需要 template
关键字:
void S::J<void>::f() {}
在这一点上,S::J<void>
只是另一个 class,所以这与您的标准没有什么不同:
void Class::method() { }
如果您要定义模板的成员函数,则只需要 template
,例如:
template <typename T>
void S::J<T>::g() { }
或成员函数模板:
template <typename T>
void S::J<void>::h<T>() { }
请考虑以下格式错误的程序:
struct S {
template<class T> struct J { };
};
template<>
struct S::J<void> {
void f();
};
template<>
void S::J<void>::f() {} // ERROR
$ clang++ -std=c++11 test.cpp
no function template matches function template specialization 'f'
$ g++ -std=c++11 test.cpp
template-id ‘f<>’ for ‘void S::J<void>::f()’ does not match any template declaration
为什么 f
的定义不能编译?如何在上面正确定义函数f
?
clang 错误在这里很有用:
no function template matches function template specialization 'f'
// ^^^^^^^^^^^^^^^^^
您使用的语法适用于函数模板。但是 f
不是函数模板,它只是一个函数。要定义它,我们不需要 template
关键字:
void S::J<void>::f() {}
在这一点上,S::J<void>
只是另一个 class,所以这与您的标准没有什么不同:
void Class::method() { }
如果您要定义模板的成员函数,则只需要 template
,例如:
template <typename T>
void S::J<T>::g() { }
或成员函数模板:
template <typename T>
void S::J<void>::h<T>() { }