Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么即使我们在函数中没有使用diduced类型,也必须在每个函数之前包含模板参数?_C++_Templates - Fatal编程技术网

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

C++ 为什么即使我们在函数中没有使用diduced类型,也必须在每个函数之前包含模板参数?,c++,templates,C++,Templates,为什么我们假设在每个函数前面使用模板参数,即使我们没有在函数中使用推导出的模板参数。正如我们所见,我没有在printP()函数中使用模板参数\u T(大约30),那么为什么需要在该函数前面包含模板语法呢 > >代码>注释:< /代码> 这是我的大类的一个非常简化的版本,它看起来很傻,因为它很小,但是,考虑一个情况,你使用模板只占你的类的几个(2-3)函数,但是你注定要键入(甚至复制过去)。每个函数前面都有这么长的模板语法,但我想问为什么 有什么办法可以解决这个问题吗 #include <

为什么我们假设在每个函数前面使用模板参数,即使我们没有在函数中使用推导出的模板参数。正如我们所见,我没有在
printP()
函数中使用模板参数
\u T
(大约30),那么为什么需要在该函数前面包含模板语法呢

<> > >代码>注释:< /代码> <强>这是我的大类的一个非常简化的版本,它看起来很傻,因为它很小,但是,考虑一个情况,你使用模板只占你的类的几个(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();
}
#包括
#包括
#包括
使用名称空间std;
模板
阶级事务{
国际(p);
_杜克;
公众:
事物(int p,_tk):_p(p),_k(k){
void printK();
void printP();
};
模板
void Thing::printK(){

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

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

* 这里的类(Thing)是模板类,所以它的名称也需要类型(比如Thing)。
我希望你明白我的意思。

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

#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();
}
#包括
使用名称空间std;
类库
{
公众:
ThingBase(int p)
:(p)
{
}
void printP();
受保护的:
国际(p);
};
void ThingBase::printP(){

cout当您定义一个成员函数时,您需要用类名限定它。类名是
Thing
,而不是
Thing
(它是模板的名称)这是一个非常恼人的事情C++。这就是为什么我不需要把我的函数分离到模板类之外,除非绝对必要。这是不值得的。但是,需要有一些东西,因为我不想把我的函数定义放在我的类中,我看不出我的功能看起来非常丑陋:(:(算了吧。无论如何,你都不允许给你的模板参数命名(它是一个),所以它应该是
东西
,这样就不那么难看了。oo yee@JonathanWakely,但是通过看到标准标题,我现在习惯了:)谢谢@ AikasMI,但是我正在寻找一些东西,它们可以去掉你解释的东西。定义函数内联;在Cype中,我认为一些C++大师会在C++ 17中实现它,并告诉我他们正在实现它:P.,或者可能是他们真的在执行我不知道的。是的。o上课。:(请等待一些导师:D