std::make_shared 三元返回不编译
std::make_shared ternary return doesn't compile
我正在使用Visual Studio 2010,并有工厂创建一个抽象基类的两个实现之一。工厂Create方法接受bool标志,并返回shared_ptr中的两个imps之一。使用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;
}
VS给出的误差是没有可用的用户定义的转换操作符可以执行此转换,或者无法调用该操作符c:pathfile.h(78):错误C2668: 'std::tr1::shared_ptr<_Ty>::shared_ptr':对重载函数的模糊调用与[_Ty =基地)
注意
static std::shared_ptr<Base> Create(bool isFoo) {
if (isFoo)
return std::make_shared<Foo>();
return std::make_shared<Bar>();
}
这是因为三元运算中的第二个和第三个表达式必须相互转换。在您的情况下,std::shared_ptr<Foo>
根本不能转换为std::shared_ptr<Bar>
,反之亦然。
两者均可转化为std::shared_ptr<Base>
,但不能相互转化
当您有两个不同的类类型作为三元条件操作符的第二个和第三个操作数时,通常必须能够将其中一个转换为另一个。如果两者都不能转换为另一种类型,则程序将无法编译,即使存在第三种类型,两者都可以转换为另一种类型,如本例。
解决方案:
return isFoo ?
std::shared_ptr<Base>(std::make_shared<Foo>()) :
std::shared_ptr<Base>(std::make_shared<Bar>());
std::make_shared<T>()
的返回类型为std::shared_ptr<T>
。
两个派生类都可以转换为它们的基类,因此两个shared_ptr
都可以转换为shared_ptr<base>
,但是三元操作符期望它的第二个和第三个形参已经具有相同的类型,或者恰好其中一个可以转换为另一个。
正如您的注释所示,问题在于三元运算符。在c++中,每个表达式(甚至像a=1这样的表达式)都有一个类型。在您的示例中,编译器必须尝试推断表达式isFoo ? std::make_shared<Foo>() : std::make_shared<Bar>();
的类型,通常编译器会查找适用于第二个和第三个操作数的类型(在本例中是make_shared调用)。VS在它的错误信息中试图告诉你的是它没有找到一个通用类型。
相反,if语句可以工作,因为make_shared调用是两个独立的表达式,因此不需要公共类型。
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- 三元运算符在返回语句中给出意外的结果
- 有没有办法将 for 循环结果返回到像三元运算符这样的函数中?
- 用于返回开关的三元运算符
- 如何确定三元运算符的返回类型?
- 动态指针引用数组由三元运算符返回值,但有异常
- 三元运算符为C++中返回的引用创建临时
- 三元运算符:编译器不发出局部变量警告的返回引用
- 为什么在三元运算符的分支之间返回 lambda 对某些 lambda 有效?
- 在C 中使用三元运算符始终返回错误条件
- 三元运算符为什么以及何时返回左值?
- 为什么三元运算符阻止返回值优化
- 返回类型的声明类型时,应用于三元(?:)表达式
- 返回语句中的三元运算符
- C++14:使用三元表达式从 constexpr 推导(自动)返回类型
- 使用三元操作符从函数返回统一初始化
- std::make_shared 三元返回不编译