为什么有必要在每个函数之前包含模板参数,即使我们没有在函数中使用diduced类型?

时间:2014-11-20 10:48:22

标签: c++ templates

为什么我们假设在每个函数前面都使用模板参数,即使我们没有在函数中使用推导出的模板参数。我们可以看到我没有在 _T 函数(大约30)中使用模板参数 printP() ,那么为什么需要包含模板语法在这个功能的前面。

NOTE: 这是我的大班的非常简化的版本,它可能看起来很傻,因为它很小但是,考虑一下你只使用模板的情况[2] -3]你的类的功能,但你必须在每个函数前面键入(甚至复制过去)这个冗长的模板语法,但我问为什么??

有没有办法搞定这个

#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;

template<typename _T>
class Thing{
        int _p;
        _T _k;
    public:
        Thing(int p, _T k):_p(p),_k(k){}
        void printK();
        void printP();
    };

template<typename _T>
void Thing<_T>::printK(){
    cout << _k << endl;
    }

template<typename _T>
void Thing<_T>::printP(){
    cout << _p << endl;     // as we can see that i am not using template paramerter "_T" 
    }                       // here in this function then why it is required to include template syntax

int main()
{
    Thing<int> a(1,2);
    a.printK();
    a.printP();
}

2 个答案:

答案 0 :(得分:1)

因为PrintK函数是模板类Thing&lt; _T&gt;的成员。对于类外的成员函数定义,函数名称还包括类名(它所属的类,这里它属于Thing),因为Thing是模板,所以函数名要求你提供模板参数(这里是T)。 例如 类外的函数定义需要以下语法 **

返回类型类名::函数名(参数列表)

* 这里的class(Thing)是模板类,因此它的名称也需要类型(比如Thing&lt; _T&gt;)。 我希望你明白我的观点。

答案 1 :(得分:0)

将模板类的成员和函数限制为依赖于模板参数的成员和函数通常是个好主意。非依赖成员和函数可以放在一个单独的非=模板类中(有更好的名称吗?)。例如:

#include <iostream>

using namespace std;

class ThingBase
{
public:
    ThingBase(int p)
        : _p(p)
    {
    }
    void printP();
protected:
    int _p;
};

void ThingBase::printP(){
    cout << _p << endl;
}


template<typename _T>
class Thing : public ThingBase {
    _T _k;
public:
    Thing(int p, _T k)
        : ThingBase(p),
          _k(k){}
    void printK();
};

template<typename _T>
void Thing<_T>::printK(){
    cout << _k << endl;
}


int main()
{
    Thing<int> a(1,2);
    a.printK();
    a.printP();
}