2011-07-07 78 views
0

如何templatize iostream和fstream對象?這樣(請參閱代碼)是不正確的......感謝您的幫助。C++ templatize輸出:iostream或fstream

template <typename O> 
void test(O &o) 
{ 
    o << std::showpoint << std::fixed << std::right; 
    o << "test"; 
} 

int main(int argc, _TCHAR* argv[]) 
{ 
    std::iostream out1; //Write into console 
    std::ofstream out2 ("file.txt"); //Write into file 
    .... 

    test(out1); 
    test (out2); 

    return 0; 
} 
+0

請提供*完整*最小示例程序,以及編譯或運行時看到的完整錯誤消息。有關如何以及爲什麼這樣做的更多信息,請參閱http://sscce.org。 –

回答

0

您的模板功能對我來說是完美的,雖然您的main函數有一些嚴重的錯誤。修復你的錯誤後,該程序的工作對我來說:

#include <iostream> 
#include <fstream> 


template <typename O> 
void test(O &o) 
{ 
    o << std::showpoint << std::fixed << std::right; 
    o << "test"; 
} 

int main(int argc, char* argv[]) 
{ 
    // std::iostream out1; //Write into console 
    std::ofstream out2 ("file.txt"); //Write into file 
// .... 

    test(std::cout); 
    test (out2); 

    return 0; 
} 

我不知道爲什麼想要一個模板函數,雖然。規則多態對於這種特殊情況更有意義。

+0

感謝您的幫助。 – Johnas

2

這裏有兩個問題:

  1. 爲了使可寫入到任意輸出流的功能,你不需要使它成爲一個模板。相反,讓它通過引用將ostream作爲參數。 ostream是所有輸出流對象的基類,因此該函數可以接受任何輸出流。

  2. iostream類是一個不能直接實例化的抽象類。它被設計成可以讀寫的其他流類的基類,比如fstream和stringstream。如果你想用你的函數pass cout作爲參數打印到控制檯。

希望這有助於!

+0

感謝您的有益評論... – Johnas