2011-12-19 71 views
1
template <> 
class test<int> { 
    int y; 
public:  
    test(int k) : y(k) {}  
    friend ofstream& operator<< <test<int>> (ofstream& os, const test<int>& t); 
}; 
template<> 
ofstream& operator<< <test<int> > (ofstream& os, const test<int>& t) 
{ 
    os << t.y; 
    return os; 
} 

上面的代碼是在int版本中測試的專用模板類。我正在嘗試超載流運算符< <函數。但它顯示錯誤信息;ostream專用模板類的朋友函數

C2027:使用未定義的類型 '的std :: basic_ofstream < _Elem,_Traits>'

此外,同樣的方法適用於普通函數(不ofstream的操作< <但功能我make)有沒有對我們運營商< <的功能在一個專門的模板類中?

+0

您有加入''或只是''? – 2011-12-19 13:55:24

回答

1

您需要包括

#include <iostream> 

在函數模板實例化時。也許你只包括

#include <iosfwd> 

此外,你不應該定義(靜態)的朋友作爲模板:https://ideone.com/1HRlZ

#include <iostream> 

template <typename> class test; 

template <> 
class test<int> { 
    int y; 
public:  
    test(int k) : y(k) {}  
    friend std::ostream& operator<<(std::ostream& os, const test& t); 
}; 

std::ostream& operator<< (std::ostream& os, const test<int>& t) 
{ 
    return os << t.y; 
} 

int main() 
{ 
    test<int> a(42); 
    std::cout << a << std::endl; 
} 

注意,這是不是有一個好主意「使用namespace std'在你的頭文件中,這就是爲什麼我從樣本中刪除它的原因。 (它可能會導致您的頭文件的用戶衝突,當他們包括您的標頭

+0

解決了完成測試的'ostream'操作員的另一個問題:https://ideone.com/1HRlZ – sehe 2011-12-19 14:07:18

+0

我實際上包含了兩個頭文件,但錯誤並沒有消失 – Jaebum 2012-01-05 17:31:05

0

這裏有一些有趣的問題。首先明顯的家政

  • 你應該#include <fstream>,不要忘記using namespace std
  • operator <<不應該是一個模板,它應該是一個重載函數。
  • os << t.y混淆我的編譯器(G ++ 4.4.3:「警告:ISO C++說,這些都是不明確的,即使第一個最壞的轉換比第二最壞的轉換更好:」)。您打算將整數推送到流中,但編譯器注意到可以通過構造函數將int變成test<int>,因此它不知道您是否要推inttest<int>。這是我知道的愚蠢,可以通過構造函數explicit來解決。

    #include <fstream> 
    using namespace std; 
    template <typename T> 
    class test; 
    
    template <> 
    class test<int> { 
        int y; 
    public: 
        explicit test(int k) : y(k) {} 
        // friend ofstream& operator<< < test<int> > (ofstream& os, const test<int>& t); 
        friend ofstream& operator<< (ofstream& os, const test<int>& t); 
    }; 
    // template<> 
    // ofstream& operator<< <test<int> > (ofstream& os, const test<int>& t) 
    ofstream& operator<< (ofstream& os, const test<int>& t) 
    { 
        os << t.y; 
        return os; 
    } 
    int main() { 
    }