繁体   English   中英

C ++无效的二进制运算符

[英]C++ invalid operands to binary expression

我在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 ,或者使用此答案的想法,添加一个operator! 并使用两次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM