下面的代码可以在Visual Studio中编译,但在gcc中失败。
template<typename Isth>
class A
{
public:
A(const boost::shared_ptr<Isth>& obj) {...}
...
};
在B类的方法中:
A<Isth1> B::method1
{
boost::shared_ptr<Isth2> myPtr = boost::make_shared<Isth2>();
//Isth2 is derived from Isth1;
...
return myPtr;
}
在gcc中,出现错误“无法将'myPtr'从'boost::shared_ptr'转换为'A'”
我认为A的构造函数应在B::method1返回时调用。
提前致谢!
最佳答案
其他人特别指出了这个问题-如果shared_ptr<Isth2>
不需要用户定义的转换,则只能将其转换为A<Isth1>
的构造函数参数。但是既然这样,就不能使用该构造函数。
同样,统一初始化有助于完成这项工作
A<Isth1> B::method1()
{
boost::shared_ptr<Isth2> myPtr = boost::make_shared<Isth2>();
//Isth2 is derived from Isth1;
...
return { myPtr };
}
为了统一初始化返回值,允许用户定义构造函数参数的转换。如果只想更改
A
类,则可能要编写一些SFINAEtemplate<typename T, typename std::enable_if<
std::is_base_of<Isth, T>::value, bool>::type = true>
A(const boost::shared_ptr<T>& obj) {...}
您基本上是在声明“我正在隐式地从任何指向
Isth
派生的对象的共享ptr进行转换”。