2015-05-05 40 views
15

Stringstream nesnesini kullanmaya çalışırken bir şey farkettim. İşte bu açıklamaya bir işe yaramaz örnektir:std :: stringstream ve str yöntemi

stringstream ss ; 
ss << "my string" ; 
cout << ss.str() << endl ; 

cout << (stringstream() << "my string").str() << endl ; 

Bu ‘sınıf std :: basic_ostream’ ‘str’ adlı herhangi üyesi var şikayetçi bir derleme hatasına yol açar eşdeğer değil.

Bunu açıklayamıyorum. Bu benim uygulama için kritik değil ama emin olmak için bu bir C++ hile gizlemek oldukça eminim.

Not: i C++ 14

+0

Çözüm: static_cast (stringstream() << "dizgim"). Str() '. Ya da, biliyorsunuz, adlandırılmış değişkeni kullanın. – Potatoswatter

+0

Sonunda açıktı, bunu açıklamaya çalışırken yanlış yoldan gitmiştim. – Falco

cevap

22

operator<< ile gcc kullanıyorum std::stringstream için tanımlandığı değildir, ama onun temel sınıf std::ostream için, bu nedenle, bu nedenle std::stringstream ve bir başvuru dönmez yöntem str() (std::stringstream yöntemidir) bulunamadı.

Teknik olarak yukarıda aslında std::basic_stringstream<CharT,Traits> ve std::basic_ostream<CharT,Traits>, ancak fikir :) bununla

6

sorun olsun:

cout << (stringstream() << "my string").str() << endl; 

Bu ifade stringstream() << "my string", bir std::ostream& nesnesi döndüren olduğunu değil std::stringstream. Eğer bir std::stringstream nesne üzerinde << ve >> operatörlerini kullanırken, bu aşırı yüklenmeleri arayacak, Şimdi

template<typename Type> 
std::stringstream& operator<<(std::stringstream& ss, const Type& type) 
{ 
    static_cast<std::ostream&>(ss) << type; 
    return ss; 
} 

template<typename Type> 
std::stringstream& operator<<(std::stringstream&& ss, const Type& type) 
{ 
    static_cast<std::ostream&>(ss) << type; 
    return ss; 
} 

template<typename Type> 
std::stringstream& operator>>(std::stringstream& ss, Type& type) 
{ 
    static_cast<std::istream&>(ss) >> type; 
    return ss; 
} 

template<typename Type> 
std::stringstream& operator>>(std::stringstream&& ss, Type& type) 
{ 
    static_cast<std::istream&>(ss) >> type; 
    return ss; 
} 

ve bunu bir std::stringstream& yapabilirsiniz döndürür:

Bazı uygun olarak aşırı yüklemelerde tanımlayarak bu düzeltebilirsiniz arayüzünü doğrudan kullanın.

İlgili konular