Template类在C ++中生成错误

时间:2013-04-21 09:26:16

标签: c++ class templates

此程序未编译。有什么问题?

#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;&lt;' :没有找到哪个运算符采用'std :: string'类型的右手操作数(或者没有可接受的转换)             c:\ program files(x86)\ microsoft visual studio 10.0 \ vc \ include \ ostream(679):可能是'std :: basic_ostream&lt; _Elem,_Traits&gt; &amp; std :: operator&lt;&lt;&gt;(std :: basic_ostream&lt; _Elem,_Traits&gt;&amp;,const char *)'            同            [                 _Elem =炭,                 _Traits =标准:: char_traits             ]

     

尝试匹配参数列表'(std :: ostream,std :: string)'             ..... \ maptest \ mapt \ mapt \ mapt.cpp(16):编译类模板成员函数'void Data :: WriteData(void)'             同             [                 T = INT             ]

2 个答案:

答案 0 :(得分:9)

好像你忘记了:

 #include <string>

您不能指望传递包含所有必需的头文件,因为像<iostream>这样的其他标题可能会#include

如果您使用std::string,则应明确#include <string>相应的标头(operator <<)。

接受std::string的{​​{1}}的超载可能是在{em>不 #include d <iostream>的标头中声明/定义的。< / p>

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

using namespace std;

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

答案 1 :(得分:2)

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;
}