1

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

#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:二进制“<<”:未找到采用“std::string”类型右侧操作数的运算符(或没有可接受的转换)c:\program files (x86)\microsoft visual studio 10.0\vc \include\ostream(679): 可以是 'std::basic_ostream<_Elem,_Traits> &std::operator <<>(std::basic_ostream<_Elem,_Traits> &,const char *)' 与 [ _Elem=char, _Traits=std::char_traits ]

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

4

2 回答 2

9

您似乎忘记了:

 #include <string>

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

如果您使用std::strings,您应该明确地#include使用适当的标头 ( <string>)。

operator <<接受 an的重载可能在不是d bystd::string的标头中声明/定义。 #include<iostream>

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

using namespace std;

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

于 2013-04-21T09:26:53.450 回答
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;
}
于 2013-04-21T09:42:02.117 回答