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]
你似乎忘记了:
#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)
它们很容易导致名称冲突,通常被认为是一种糟糕的编程习惯.