【发布时间】:2011-09-04 23:28:29
【问题描述】:
这段代码的最后一行使用castingAndTernary.cpp:15: error: conditional expression between distinct pointer types ‘D1*’ and ‘D2*’ lacks a cast编译失败
真正聪明的编译器不会有任何困难,因为两者都可以安全地转换为B*(基类)。我不愿意使用 static_cast 和 dynamic_cast 等等——我担心有一天我会混淆这些类并得到未定义的行为。这就是我创建 up_cast 模板的原因。此模板在允许的转换中做了最低限度的工作。有没有更简单的方法?还有其他解决方法,但我不禁想到还有更简单、更安全的方法可以使用?
struct B{ };
struct D1 : public B{ };
struct D2 : public B{ };
template<typename T,typename V>
T up_cast(V x) {
return x;
}
int main() {
bool boolean_expression = true;
B * b;
b = new D1;
b = new D2;
b = boolean_expression ? up_cast<B*>(new D1) : up_cast<B*>(new D2);
b = boolean_expression ? new D1 : new D2;
}
g++ (Ubuntu 4.3.3-5ubuntu4) 4.3.3
更新根据@Konrad 的回答将名称从implicit_cast 更改为up_cast
【问题讨论】:
-
短语“隐式转换”没有意义。强制转换是一种显式转换。
-
对于更复杂的方法:
b = boolean_expression ? new D1 : (true? new D2 : (B*)0 ); -
我相信您的演员表在功能上与 C 风格演员表相同。
-
@Tomalak,我从here 得到了隐含这个词“'static_cast' 允许执行任何可以隐式执行的转换以及逆转换(甚至如果这不是隐式允许的)。” (我的重点)
-
@Aaron McDaid:如果你要这样做,我建议你明确指针,这样如果你在非指针上尝试它会失败(而不是潜在地复制) .考虑一下
D1 d1; up_cast<B&>(d1);,它看起来很合理,但不会像您期望的那样:template <typename T, typename U> T* up_cast( U* p ) { return p; }应该可以解决问题。
标签: c++ casting ternary-operator