gpt4 book ai didi

c++ - 为什么我需要转换?

转载 作者:可可西里 更新时间:2023-11-01 17:08:32 24 4
gpt4 key购买 nike

在这段代码中:

template<class T>
struct Side
{
};

template<class T>
struct LeftSide : public Side<T>
{
};
template<class T>
struct RightSide : public Side<T>
{
};

Side<int>* f(int left, int right)
{
return left < right ? new LeftSide<int> : new RightSide<int>;//<---Here I'm returning either left or right side
}

int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

我收到一个错误:
_Error 1 错误 C2446:“:”:没有从“RightSide *”到“LeftSide *”的转换_

我认为(我认为是错误的)我可以毫无问题地将派生指针分配给基类。那么问题出在哪里呢?

最佳答案

问题不在于来自 LeftSide 的转换或 RightSideSide<T> .如您最初所想,此转换会很好。

相反,问题出在这个表达式上:

left < right ? new LeftSide<int> : new RightSide<int>

让我们稍微分解一下。三元运算符(在标准中恰本地称为“比较运算符”)如下所示:

bool_val ? lhs_expression : rhs_expression

请记住,整个构造本身就是一个表达式。这意味着它返回一个值,该值必须具有类型 obv。 整个表达式的类型是从 lhs_expression 的类型推导出来的和 rhs_expression .在这种情况下,您有一个 LeftSide和一个 RightSide .所以,这是你的问题。

LeftSideRightSide除了有一个共同的基类之外,彼此没有直接关系,并且它们之间没有可用的转换。 (你必须写一个。)所以没有单一的数据类型 bool_val ? lhs_expression : rhs_expression可以有。您可能会想,“好吧,愚蠢的编译器,为什么不找出公共(public)基类并使用它呢?”这确实有点痛苦。撇开它是对还是错的争论,它只是行不通。

你有两个选择。

一,使用更简单的结构:

if( left < right )
return new LeftSide<int>;
else
return new RightSide<int>;

第二,如果你真的真的想使用三元运算符(有时就是这种情况),你需要用勺子喂编译器它的数据类型:

Side<int>* f(int left, int right)
{
return left < right ? static_cast<Side<int>*>(new LeftSide<int>) : static_cast<Side<int>*>(new RightSide<int>);// now you're good
}

关于c++ - 为什么我需要转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3833736/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com