模板类在C++中生成错误

Template class generate errors in C++

本文关键字:错误 C++      更新时间:2023-10-16

此程序未编译。怎么了?

#include<iostream>
#include<map>
using namespace std;
template<class T>class Data{
    string header;
    T data;
public:
    Data(string h, T d){header = h, data = d;}
    void WriteData()
    {
        cout<<header<<": "<<data<<endl;
    }
};

int main(int argc, _TCHAR* argv[])
{
    Data<int> idata("Roll", 100);
    Data<string>sdata("Name","Jakir");
    idata.WriteData();
    sdata.WriteData();
    return 0;
}

显示以下错误。

错误C2679:二进制'<lt;':找不到接受类型为"std::string"的右侧操作数的运算符(或者没有可接受的转换(c: \program files(x86(\microsoft visual studio 10.0\vc\include\ostream(679(:可以是'std::basic_stream&lt_Elem,_Traits>&std::运算符<lt;>(std::basic_stream<_Elem,_Traits>&,const-char*('具有[_Elem=字符,_特征=std::char_Traits]

尝试匹配参数列表"(std::ostream,std::string("时…..\maptest\mapt\mapt.cpp(16(:编译类模板成员函数"void Data::WriteData(void("时具有[T=int]

您似乎忘记了:

 #include <string>

您不能指望传递性地包含所有必要的头文件,因为像<iostream>这样的其他头文件可能会#include它们。

如果您使用的是std::string,那么应该是#include显式地使用相应的标头(<string>(。

接受std::stringoperator <<的过载可能由<iostream>而不是#included的报头中声明/定义。

此外,请避免在全局命名空间范围中使用using指令,例如:

using namespace std;

它们很容易导致名称冲突,这通常被认为是一种糟糕的编程实践。

T_char的类型不正确,因为argv应该有一个类型,例如char*

正确的源代码是

#include<iostream>
#include<map>
#include<string>
using namespace std;
template<class T>class Data{
    string header;
    T data;
public:
    Data(string h, T d){header = h, data = d;}
    void WriteData()
    {
        cout<<header<<": "<<data<<endl;
    }
};

int main(int argc, char* argv[])
{
    Data<int> idata("Roll", 100);
    Data<string>sdata("Name","Jakir");
    idata.WriteData();
    sdata.WriteData();
    return 0;
}