std :: make_shared三元返回不编译

Kev*_*vin 4 c++ factory ternary-operator visual-studio-2010

我正在使用Visual Studio 2010并且有工厂用于创建抽象基类的两个实现之一.工厂Create方法接受bool标志并返回shared_ptr中的两个impl之一.使用if语句对我来说很好,但是当我尝试使用带有make_shared调用的三元组时,编译器会抱怨.

class Base {
public:
   Base() {};
};

class Foo : public Base {
public:
    Foo() {};
};

class Bar : public Base {
public:
    Bar() {};
};

class Factory {
public:
    static std::shared_ptr<Base> Create(bool isFoo) {
        return isFoo ?
            std::make_shared<Foo>() :
            std::make_shared<Bar>();
    }
};

int main() {
    std::shared_ptr<Base> instance = Factory::Create(true);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

VS给出的错误是'没有可以执行此转换的用户定义转换运算符,或者运算符不能被调用c:\ path\file.h(78):错误C2668:'std :: tr1 :: shared_ptr <_Ty> :: shared_ptr':使用[_Ty = Base]对重载函数进行模糊调用

注意

static std::shared_ptr<Base> Create(bool isFoo) {
    if (isFoo)
        return std::make_shared<Foo>();
    return std::make_shared<Bar>();
}
Run Code Online (Sandbox Code Playgroud)

编译得很好.

Som*_*ude 7

这是因为三元运算中的第二个和第三个表达式必须可以相互转换.在你的情况下std::shared_ptr<Foo>根本不可转换std::shared_ptr<Bar>,反之亦然.

虽然它们都可以转换为std::shared_ptr<Base>它们,但它们不能相互转换.