关于wcout和cout,wstring和string的混淆

时间:2014-01-03 15:58:07

标签: c++ string

我有一个包含单个wstring的类。 我有2个打印功能,一个用于ostream,另一个用于wostream

必须像这样使用它们:

 MyClass<char> s;
 s.push_back( 'H' );
 s.push_back( 'i' );
 //Printing with ostream   
 s.print( std::cout );

 MyClass<wchar_t> w;
 w.push_back( L'C' );
 w.push_back( L'+' );
 //Printing with wostream
 w.print( std::wcout );

我的问题是,我无法使用ostream功能,这是我的班级:

template<typename T>
MyClass{

private:

std::wstring *data;

public:

void push_back(const T& t) {

    data->push_back(t);
}
    //Does not work
void print(std::ostream& out) const{

    out<<*data;  //Results in a compile error

}
    //Does work verry well
void print(std::wostream& out) const {
    out << *data;
}


};

我怎么能做到这一点?

P.S。:我知道这是胡说八道,但实际上这是我去年的学校考试。所以我无法改变标准。这是任务。

2 个答案:

答案 0 :(得分:8)

问题在于,无论模板类型std::wstringT还是char,您都要存储wchar_t。相反,您希望使用具有适当类型的模板std::basic_string

std::basic_string<T> *data;

std::string只是std::basic_string<char>的typedef,std::wstring只是std::basic_string<wchar_t>的typedef。

同样,std::ostream只是std::basic_ostream<char>的typedef,std::wostream只是std::basic_ostream<wchar_t>的typedef,因此您可以拥有一个print函数在适当的类型上采用std::basic_ostream模板。

答案 1 :(得分:4)

存储正确类型的字符串

std::basic_string<T> data;

并重载只有正确的basic_ostream专精,而不是ostreamwostream

void print(std::basic_ostream<T> & out) const {
    out << data;
}

(另外,存储字符串本身而不是未初始化的指针会产生更好的结果)。