“ template <class t,=”“ class =”“ c =”“>”和“ template <class t =”“> template <class c =”“>”之间有什么区别

时间:2019-03-08 11:37:23

标签: c++ templates

由于我喜欢将接口和实现分开,所以我没有将模板类仅在标头中实现,而是将其分为.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){...}

...

1 个答案:

答案 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<>中,则语法将不明确。