【发布时间】:2020-12-17 16:24:39
【问题描述】:
我想写一个转换器。我更喜欢一个已经处理琐碎情况的基类,其中 InputType 可以直接转换为 OutputType,比如 float 到 double。
但是,在这个简短的示例中,我收到一个错误:
错误 C2440:“static_cast”:无法从“const Eigen::Vector2d”转换为“std::tuple
”
在我看来,基类和 set 函数已被实例化,尽管该函数已被覆盖。由于 Eigen::Vector2d 和 std::tuple 之间没有转换,因此会出现错误。 我错过了什么吗?实现初始目标的正确方法是什么?
这个基类也应该处理像 OutputType = InputType 这样的琐碎情况:
template <typename InputType, typename OutputType>
class DefaultConverter
{
public:
virtual void set(const InputType& input)
{
output = static_cast<OutputType>(input);
}
protected:
OutputType output;
};
现在是导致错误的派生类:
class Array2Eigen : public DefaultConverter<Eigen::Vector2d, std::tuple<double, double>>
{
public:
void set(const Eigen::Vector2d& input) override
{
output = std::make_tuple(input[0], input[1]);
}
double getFirst() { return std::get<0>(output); }
};
一些测试代码:
int main(int argc, _TCHAR* argv[])
{
Eigen::Vector2d input(1.0, 2.0);
Array2Eigen converter;
converter.set(input);
std::cout << converter.getFirst() << std::endl;
return 0;
}
【问题讨论】:
-
虚方法被实例化。
标签: c++ templates overriding