【问题标题】:Does overriding a function instantiate the base function? (getting error)重写函数是否会实例化基本函数? (得到错误)
【发布时间】: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


【解决方案1】:

虚方法和类是在同一时间实例化的,所以应该是正确的。

您可以提供 2 个版本:

template <typename InputType, typename OutputType, typename Enabler = void>
class DefaultConverter 
{
public:
    virtual ~DefaultConverter() = default;
    virtual void set(const InputType& input) = 0;

protected:
    OutputType output;
};

template <typename InputType, typename OutputType>
class DefaultConverter<InputType, OutputType,
                       std::enable_if_t<std::is_convertible_v<InputType, OutputType>>>
{
public:
    virtual ~DefaultConverter() = default;
    virtual void set(const InputType& input)
    {
        output = static_cast<OutputType>(input);
    }

protected:
    OutputType output;
};

【讨论】:

  • 等等,什么?但是他在覆盖基础函数......它怎么还在使用??
  • Array2Eigen[}.DefaultConverter&lt;..&gt;::set(input) 应该是合法电话
  • 我现在明白了。模板DefaultConverter&lt;Eigen::Vector2d, std::tuple&lt;double, double&gt;&gt; 已实例化,其中将包含非法语句.. 感谢您的提示,信息丰富的问题​​和答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2016-08-12
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多