覆盖函数是否实例化基本函数? (得到错误)
Does overriding a function instantiate the base function? (getting error)
我想写一个转换器。我更喜欢一个基础 class,它已经处理了 InputType 可以直接转换为 OutputType 的琐碎情况,比如说 float 到 double。
但是,在这个缩短的例子中,我得到一个错误:
error C2440: 'static_cast' : cannot convert from 'const Eigen::Vector2d' to 'std::tuple<double,double>'
对我来说,基础 class 和 set 函数被实例化了,尽管函数被覆盖了。由于 Eigen::Vector2d 和 std::tuple 之间没有转换,因此出现错误。
我错过了什么吗?实现最初目标的正确方法是什么?
基础 class 也应该处理像 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:
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;
}
虚方法与class同时实例化,所以应该是正确的。
您可以提供 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;
};
我想写一个转换器。我更喜欢一个基础 class,它已经处理了 InputType 可以直接转换为 OutputType 的琐碎情况,比如说 float 到 double。
但是,在这个缩短的例子中,我得到一个错误:
error C2440: 'static_cast' : cannot convert from 'const Eigen::Vector2d' to 'std::tuple<double,double>'
对我来说,基础 class 和 set 函数被实例化了,尽管函数被覆盖了。由于 Eigen::Vector2d 和 std::tuple 之间没有转换,因此出现错误。 我错过了什么吗?实现最初目标的正确方法是什么?
基础 class 也应该处理像 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:
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;
}
虚方法与class同时实例化,所以应该是正确的。
您可以提供 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;
};