【发布时间】:2011-11-27 00:44:19
【问题描述】:
我基本上有以下两个类,我使用按值返回函数来创建对象。 在下面的 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);
}
【问题讨论】:
-
// OK行很好,为什么需要其他解决方案? -
@KerrekSB,因为这是我第一次尝试,所以我想知道哪里出了问题。
-
好的,但是
// OK行是唯一“正确”的做法。不要使用其他的。 -
@KerrekSB,下面Adam Z.给出的解决方案也是错的?如果是,为什么?
-
这不是错误的,但你永远不会那样使用它。始终正确初始化。 Adam 方法首先默认初始化,然后赋值。最好的情况只是多余且难以阅读;在最坏的情况下,它根本不适用于非默认可构造类型(这包括基础子对象)。
标签: c++ templates functional-programming return-value return-value-optimization