gpt4 book ai didi

C++ 隐式构造函数转换后跟类型向上转换

转载 作者:行者123 更新时间:2023-11-30 02:18:33 25 4
gpt4 key购买 nike

我有一个程序,它有一个基类 Value,它有多个继承自 Value 的子类(例如 IntValue)。这些类中的每一个都有接受一个或多个参数的构造函数。这是显示我希望能够执行的操作的示例代码:

#include <iostream>

class Value {
public:
Value() {}
virtual void print(std::ostream& os) const {}
};

class IntValue: public Value {
public:
IntValue(int val): val_(val) {}
void print(std::ostream& os) const override { os << val_; }
private:
int val_;
};

class VariableValue: public Value {
public:
VariableValue(const std::string& name): name_(name) {}
void print(std::ostream& os) const override { os << name_; }
private:
const std::string name_;
};

void emit_add(const Value& lhs, const Value& rhs, std::ostream& os) {
lhs.print(os);
os << " + ";
rhs.print(os);
os << std::endl;
}

template <class ValueType>
void emit_add(const ValueType& lhs, const ValueType& rhs, std::ostream &os) {
lhs.print(os);
os << " + ";
rhs.print(os);
os << std::endl;
}

int main() {
// all these work
emit_add<IntValue>(12, 13, std::cout); // implicit constructors
emit_add<VariableValue>(std::string("x"), std::string("y"), std::cout); // implicit constructo\
rs
emit_add(VariableValue(std::string("x")), IntValue(1), std::cout); // implicit upcasting

// this doesn't
emit_add(std::string("x"), 13, std::cout); // implicit constor + implicit upcasting

return -1;
}

当我尝试使用 clang 9.1.0 进行编译时,出现以下错误:

test.cpp:47:3: error: no matching function for call to 'emit_add'
emit_add(std::string("x"), 13, std::cout); // implicit constor + implicit upcasting
^~~~~~~~
test.cpp:25:6: note: candidate function not viable: no known conversion from 'std::string' (aka
'basic_string<char, char_traits<char>, allocator<char> >') to 'const Value' for 1st
argument
void emit_add(const Value& lhs, const Value& rhs, std::ostream& os) {
^
test.cpp:33:6: note: candidate template ignored: deduced conflicting types for parameter
'ValueType' ('std::__1::basic_string<char>' vs. 'int')
void emit_add(const ValueType& lhs, const ValueType& rhs, std::ostream &os) {
^
1 error generated.

我的理解是,编译器无法调用 VariableValue 的隐式构造函数,然后将其向上转换为 Value 类型,但它显然可以 单独执行这两项操作.

是否可以强制编译器这样做?

最佳答案

VariableValue 是一个Value(因为继承是一种"is"关系),但Value 不是VariableValue (继承的“是一种”关系是单向的)。

我想说的是,如果你有一个 VariableValue 对象,你可以很容易地沿着继承链往上走,得到一个 Value 对象(或引用它)。但是你不能走另一条路,从 Value 对象沿着继承链向下,而不明确说明它。

您需要显式构造一个VariableValue 对象并将其传递给您的函数:

emit_add(VariableValue(x), 13, std::cout);

关于C++ 隐式构造函数转换后跟类型向上转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52014168/

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