2013-04-21 60 views
0

該程序未編譯。有什麼問題?模板類在C++中生成錯誤

#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:\程序文件(x86)的\微軟的Visual Studio 10.0 \ VC \包括\ ostream的(679):可以是「標準:: basic_ostream < _Elem,_Traits> &的std ::操作者< <>(標準:: basic_ostream < _Elem,_Traits> &,常量字符* )' with [ _Elem = char, _Traits = std :: char_traits ]

while試圖匹配參數列表'(std :: ostream,std :: string)' ..... \ maptest \ mapt \ mapt \ mapt.cpp(16):while compiling class template member function '無效數據::寫數據(無效)' 與 [ T = INT ]

請幫助。這很緊急。

回答

9

看來你忘了:

#include <string> 

您不能傳遞包括所有必要的頭文件的計數,因爲像<iostream>一些其他頭可能#include他們。

如果您使用的是std::string s,您應該明確地輸入適當的標頭(<string>)。其中接受std::stringoperator <<

重載很可能宣佈/在報頭中,其是不#include d由<iostream>定義。

此外,避免具有全局命名空間範圍using指令,如本:

using namespace std; 

他們很容易導致名稱衝突,它通常被認爲是不好的編程習慣。

+2

+1,有時候它是簡單的事情:) – 2013-04-21 09:28:17

+0

哦,我的上帝。我犯了什麼錯誤。非常感謝。它毀了我的2個小時。再次感謝。 – 2013-04-21 09:45:35

+1

@JakirHossain:我們都在那裏;)祝你的項目好運 – 2013-04-21 09:46:31

2

T_char是不正確類型的argv應該有例如字符類型*

正確的源代碼是

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