由于我喜欢将接口和实现分开,所以我没有将模板类仅在标头中实现,而是将其分为.h和.tpp(.tpp,以便不使用* .cpp进行编译)。然后,我将tpp包括在头文件保护的#endif
之前的头文件末尾。由于这种选择,在实现(.tpp)中,要定义一个函数,我将必须通过使用其模板参数引用每个函数来定义每个函数,如下所示:
template <class T>
T MyTemplate<T>::functionName(T t){...}
但是,我注意到在定义带有额外模板参数的成员函数时,我必须使用以下引用来对其进行定义:
template <class T>
template <class C>
T MyTemplate<T>::extraTParamFunc(T t, C c){...}
代替:
template <class T, class C>
T MyTemplate<T>::extraTParamFunc(T t, C c){...} //no declaration matches 'T MyTemplate<T>::extraTParamFunc(T, C)'
这让我感到困惑。那为什么呢? template <class T, class C>
和template <class T> template <class C>
有什么区别?
此外,这是.h和.tpp的示例,以防万一与之相关:
//MyTemplate.h
#ifndef MYTEMPLATE_H
#define MYTEMPLATE_H
template <class T>
class MyTemplate {
template <class C>
T extraTParamFunc(T t, C c);
...
}
#include "MyTemplate.tpp"
#endif //MYTEMPLATE_H
//MyTemplate.tpp
#include "MyTemplate.h"
template <class T>
template <class C>
T MyTemplate<T>::extraTParamFunc(T t, C c){...}
...
答案 0 :(得分:1)
原则上您可以在头文件中看到答案:
template <class T>
class MyTemplate {
template <class C>
T extraTParamFunc(T t, C c);
...
}
类MyTemplate
是模板。在此模板内,您定义了另一个模板,即函数MyTemplate::extraTParamFunc
。另外,如果您使用模板参数编写完整的函数名称,您将看到:MyTemplate<T>::extraTParamFunc<C>()
。这与MyTemplate<T,C>::extraTParamFunc()
或MyTemplate::extraTParamFunc<T,C>()
有所不同。
因此,您在模板内有一个模板,语法需要反映这一点。如果您进行模板专业化,尤其是部分专业化,或者如果您具有可选的模板参数,那么如果C ++允许您将两个模板合并在一行template<>
中,则语法将不明确。