下面的代码可以在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类,则可能要编写一些SFINAE
template<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进行转换”。

10-06 11:24