gpt4 book ai didi

C++ 二进制表达式的无效操作数

转载 作者:太空宇宙 更新时间:2023-11-04 16:07:03 25 4
gpt4 key购买 nike

我在 C++11 中遇到了一个奇怪的编译错误。

我有一个定义枚举类的模板类:

template <typename Type>
class stats {
public:
// ...
enum class stat {
AVERAGE = (1 << 0),
STANDARD_DERIVATION = (1 << 1),
// ...
};
// ...
};

我目前想在按位运算中使用这个枚举。

例如,这是该枚举的用法示例:

 template <typename Type>
void
stats<Type>::build(stat stats) {
if (stats & stat::AVERAGE)
this->build_average();

if (stats & stat::STANDARD_DEVIATION)
this->build_standard_deviation();

if (stats & stat::PERCENTILES)
this->build_percentiles();

if (stats & stat::LIMITS)
this->build_limits();
}

我们可以在哪里调用这个函数 stats.build(stat::AVERAGE | stat::LIMITS) .

为了使用&|该枚举上的运算符而不必每次都手动转换为 int,我已经定义了运算符:

template<typename T>
using stat_t = typename eip::stats<T>::stat;

template <typename Type>
stat_t<Type>
operator|(const stat_t<Type>& lhs, const stat_t<Type>& rhs) {
return static_cast<stat_t<Type>>(static_cast<int>(lhs) | static_cast<int>(rhs));
}

template <typename Type>
stat_t<Type>
operator&(const stat_t<Type>& lhs, const stat_t<Type>& rhs) {
return static_cast<stat_t<Type>>(static_cast<int>(lhs) & static_cast<int>(rhs));
}

但是,如果我尝试编译,我会收到以下错误:

error: invalid operands to binary expression ('eip::stats<double>::stat' and 'eip::stats<double>::stat')
if (stats & stat::PERCENTILES)
~~~~~ ^ ~~~~~~~~~~~~~~~~~
candidate template ignored: couldn't infer template argument 'Type'
operator&(const stat_t<Type>& lhs, const stat_t<Type>& rhs) {
^

我不明白为什么我的过载被忽略了。编译器似乎为 lhs 和 rhs ( eip::stats<double>::stat ) 获得了正确的类型,但它无法推断模板...

另外:

  • 显式调用运算符有效 ( operator&<Type>(stats, stat::AVERAGE); )
  • 我认为问题出在返回类型上,但调用了 stat a = stats & stat::AVERAGE;不起作用(与之前的错误相同)。

有什么想法吗?

最佳答案

您的代码有两处错误。

  1. 这是一个不可推导的上下文:

    template <typename Type>
    stat_t<Type>
    operator&(const stat_t<Type>& lhs, const stat_t<Type>& rhs) { ... }

    这个想法和你写的一样:

    template <typename T>
    void foo(typename cls<T>::type ) { ... }

    除非您也告诉编译器,否则编译器无法弄清楚 T 可能在那里。因此,您必须在我们实际上不需要进行推导的地方定义您的 operator&:使其成为类本身的友元运算符:

    friend stat operator&(const stat& lhs, const stat& rhs) { ... }
  2. 一旦我们解决了这个问题,我们就会遇到另一个问题,即 stat 不能根据上下文转换为 bool,所以这个表达式:

    if (stats & stat::AVERAGE)

    不会编译。为此,您可能希望让您的 operator& 返回一个 intbool,或者使用 this answer的想法,添加一个operator! 并使用它两次。

关于C++ 二进制表达式的无效操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33631198/

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