2009-11-19 23 views
5

Bir kayıt sisteminin parçası olarak özel bir std::streambuf yazıyorum. Ancak, ben doğru biçimlendirilmiş olan bir akıştan çıkışının ilk parçası ile sorun yaşıyorum. Bu kullanarak g ++ Derlemestd :: ostream biçimlendirilmemiş const char * ilk kez kullanıldığında

#include <iostream> 

int main() 
{ 
    std::streambuf *coutbuf = std::cout.rdbuf(); 
    std::ostream(coutbuf) << "test" << ": writing to cout using a separate ostream." << std::endl; 
    return 0; 
} 

: Burada

herhangi özel streambuf veya ostream sınıflar kullanmayan bir azalma test durum

$ g++ --version 
g++ (Ubuntu 4.4.1-4ubuntu8) 4.4.1 

$ g++ -o fail reduced-case.cpp 

$ ./fail 
0x400c80: writing to cout using a separate ostream. 

Not bu değişmez ilk dize ("test hazır ikinci dize doğru biçimlendirilmiş sırasında ") genel bir işaretçi (dizinin adresi olarak biçimlendirilirken, hex çıkışıdır).

Düşünebildiğim tek şey, yeni oluşturulmuş bir std::ostream'u (örneğin, bir değişkene koymadan) doğrudan kullanmak için geçersiz olduğudur. Bu durumda, tam olarak neyin geçersiz kıldığını bilmek isterim (özellikle iyo-akışlarla ilgisi olmadığını, bunun yerine kurucularla veya bir şeyle yapılan değerlendirme sırasını veya etkileşimini). Sorun bu değilse, o zaman nedir?

cevap

8

sorun geçici akışı nesnesine yazma gerektiğidir. Bu: beklendiği gibi operator<<() için sol argümanı bir rvalue olduğundan

std::ostream(coutbuf) << "blah"; 

, çalışmıyor. Ancak, serbest fonksiyonu olarak aşırı tüm operatörler kendi sol bağımsız değişken olarak bir akışa olmayan bir sabit başvuru atın:

std::ostream& operator<<(std::ostream&, ...); 

SağDeğerler const olmayan referanslar bağlamak olmadığından, bunlar denilen edilemez.

Ben senin std lib uygulama ücretsiz bir fonksiyonu olarak const char* için << uygular ve std::ostream bir üyesi bazı << geri düşmesine dolayısıyla sahip olduğunu sanıyorum. Bu bir void* gibi herhangi işaretçi çıkışı biri uygulamanızda görünüyor.

Alt satır: Geçici akış nesnelerine yazma girişiminde bulunmayın.

1

Böyle bir geçici akışı nesnesi kullanamaz. Geçici değişkene bir isim verin.

#include <iostream> 

int main() 
{ 
    std::streambuf *coutbuf = std::cout.rdbuf(); 
    std::ostream os(coutbuf); 
    os << "test" << ": writing to cout using a separate ostream." << std::endl; 
    return 0; 
} 
İlgili konular