Template类在C++中生成错误

Jak*_*ain 1 c++ templates class

这个程序没有编译.有什么问题?

#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;
}
Run Code Online (Sandbox Code Playgroud)

显示以下错误.

错误C2679:二进制'<<':找不到哪个运算符采用'std :: string'类型的右手操作数(或者没有可接受的转换)c:\ program files(x86)\ microsoft visual studio 10.0\vc\include\ostream(679):可以使用[_Elem = char,'std :: basic_ostream <_Elem,_Traits>&std :: operator <<>(std :: basic_ostream <_Elem,_Traits>&,const char*)' _Traits = std :: char_traits]

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

And*_*owl 9

你似乎忘记了:

 #include <string>
Run Code Online (Sandbox Code Playgroud)

您不能指望所有必要的头文件的传递包含,因为其他一些标题<iostream>可能就像#include它们一样.

如果您使用std::string的是s,则应该明确地#include使用相应的header(<string>).

operator <<接受a的重载std::string可能在标头中声明/定义,而不是 #include d <iostream>.

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

using namespace std;
Run Code Online (Sandbox Code Playgroud)

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