此程序未编译。有什么问题?
#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 ]
答案 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;
}