2011-07-28 59 views
0

我有一個Visual Studio 2008 C++程序,我有自己的流實現。事情是這樣的:編譯器錯誤C2448返回一個std流

class Foo : public std::ostream 
{ 
public: 
    Foo(int a) : std::ostream(&buf_) { }; 
    Foo(boost::shared_ptr<int> a) : std::ostream(&buf_) { }; 
private: 
    std::filebuf buf_; 
}; 

class Bar 
{ 
public: 
    Foo GetFoo() { return Foo(1); }; 
    Foo GetFoo2() { return Foo(boost::shared_ptr<int>(new int(1))); }; 
}; 

的預期用途是這樣的:

Bar b; 
Foo f = b.GetFoo(); // works fine 
Foo f2 = b.GetFoo2(); // compiler error 

不幸的是,這給了我一個編譯器錯誤有關basic_ios拷貝構造函數。

error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' 

爲什麼是第一Foo(int)構造好與編譯器,而是一個涉及boost::shared_ptr是不是?

感謝, PaulH

回答

2

Foo類是從一個不可複製的類繼承,但是你不執行拷貝構造函數。按照值的形式傳遞Foo的實例時,你必然會遇到麻煩,就像你在getter函數中做的那樣。

GetFoo工作的原因可能是返回值優化消除了複製構造,但這並不意味着您可以這樣做。

+0

我在調試模式下編譯,所以我很驚訝RVO打開。 當你從一個使它的拷貝構造函數私有的類派生時,你能實現一個拷貝構造函數嗎? – PaulH

+0

它可能是RVO和內聯的組合......如果你真的想檢查,你可以把'get'函數放在單獨的TU中。 –