0

我基本上有以下兩類,我使用按值返回函數來創建對象。 在下面的Bar類中,我有兩個Foo類成員對象。我怎麼能正確初始化,這兩個對象中的每一個都是分開的? 下面,我正在給出一個關於顯示的編譯器錯誤的示例。基於按值返回函數正確初始化對象

template < typename T > 
class Foo{ 

    public: 
     Foo(); 
     Foo(const Foo<T> &); 
     ~Foo(); 

     friend Foo<T> createFoo1(double, bool); 
     friend Foo<T> createFoo2(double, bool); 
     friend Foo<T> createFoo3(int); 

    private: 

     std::vector<T> m_data; 

}; 

template < typename T > 
Foo<T> createFoo1(double param1, bool param2){ 
    Foo<T> myFoo; 

    // fill myFoo. 
    return (myFoo); 
} 

template < typename T > 
class Bar{ 

    public: 

     Bar(); 
     Bar(const Foo<T> &, const Foo<T> &); 
     Bar(const Bar<T> &); 
     ~Bar(); 

     friend Bar<T> createBar1(double, bool); 

    private: 
     Foo<T> m_fooY; 
     Foo<T> m_fooX; 
}; 

template < typename T > 
Bar<T> createBar1(double param1, bool param2){ 
    Bar<T> myBar(createFoo1<T>(param1, param2), createFoo1<T>(param1, param2)); //OK 
    return (myBar); 

    //Bar<T> myBar; 
    //myBar.m_fooY(createFoo1<T>(param1, param2)); // <- error C2064: term does not evaluate to a function taking 1 arguments 
    //myBar.m_fooX(createFoo1<T>(param1, param2)); // <- error C2064: term does not evaluate to a function taking 1 arguments 
    //return (myBar); 
} 
+0

的'// OK'線是罰款,爲什麼還需要另一種解決方案? –

+0

@KerrekSB,我想明白什麼是錯誤的,因爲這是我的第一次嘗試。 – Tin

+0

好的,但「OK」這一行是關於唯一「正確」的做法。不要使用其他的。 –

回答

0

這裏是你如何設置字段m_fooX和m_fooY不是通過構造函數其他:

template < typename T > 
Bar<T> createBar1(double param1, bool param2){ 
    Bar<T> myBar; 
    myBar.m_fooY = createFoo1<T>(param1, param2); 
    myBar.m_fooX = createFoo1<T>(param1, param2); 
    return myBar; 
} 
+0

謝謝!有效! – Tin