我有一个C ++ 03应用程序,其中包含一个类的单个实例,我试图在派生类型的持有者之间转换为基类型的持有者。例如:
class B { public: virtual ~B() { }; };
class A : public B { };
template< typename T >
class Container
{
public:
explicit Container( T* obj ) : obj_( obj ) { };
Container( const Container< T >& ref ) : obj_( ref.obj_ ) { };
template< typename U > operator Container< U >() {
return Container< U >( obj_ );
};
private:
T* obj_;
};
这很好用:
int main()
{
Container< A > a_ref( new A() );
Container< B > b_ref = a_ref;
return 0;
}
这给了我错误invalid initialization of reference of type ‘Container<B>&’ from expression of type ‘Container<A>’
:
void Foo( Container< B >& cb ) { }
int main()
{
Container< A > a_ref( new A() );
Foo( a_ref );
return 0;
}
这给了我错误error: invalid initialization of non-const reference of type ‘Container<B>&’ from a temporary of type ‘Container<B>’
L
int main()
{
Container< A > a_ref( new A() );
Foo( static_cast< Container< B > >( a_ref ) );
return 0;
}
如何将Container< A >
类型传递给期望Container< B >
类型的函数?我是否需要先复制该对象?
答案 0 :(得分:2)
添加另一个构造函数:
template <typename U>
Container(Container<U> const & ref,
typename std::enable_if<std::is_base_of<T, U>::value, int>::type = 0)
: obj_(ref.obj_)
{ }
我添加了enable_if
部分,以确保当U
类型实际派生自T
时,此新构造函数模板仅参与重载解析。
答案 1 :(得分:1)
Container<A>
和Container<B>
完全不同。
您可以使用container_cast<T>(U)
之类的内容将Container<A>
转换为Container<B>
container_cast将通过Container<T>
obj_
并将Container<U>
转换为obj_
T*
答案 2 :(得分:-1)
不使用容器,而是使用迭代器对,它可以很好地转换为基类。它解决了这个问题,并一次性清理代码。
编辑:在给出更多信息后,我将答案改为:
使用boost::shared_ptr
。