专门的内部类模板的功能的外层定义?

时间:2015-02-11 13:21:45

标签: c++ templates c++11 c++14 template-specialization

请考虑以下格式错误的程序:

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

1 个答案:

答案 0 :(得分:8)

clang错误在这里非常有用:

no function template matches function template specialization 'f'
// ^^^^^^^^^^^^^^^^^

您使用的语法是功能模板。但f不是函数模板,它只是一个函数。要定义它,我们不需要template关键字:

void S::J<void>::f() {}

此时,S::J<void>只是另一个类,所以这与您的标准没什么不同:

void Class::method() { }

如果您要定义模板的成员函数,则只需要template,例如:

template <typename T>
void S::J<T>::g() { }

或成员函数模板:

template <typename T>
void S::J<void>::h<T>() { }