[英]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;
不起作用(与先前相同的错误)。 任何想法?
您的代码有两件事。
这是不可推论的上下文:
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) { ... }
解决此问题后,我们将解决另一个问题,即stat
无法从上下文上下文转换为bool
因此该表达式:
if (stats & stat::AVERAGE)
不会编译。 为此,您可能希望让您的operator&
返回一个int
或bool
,或者使用此答案的想法,添加一个operator!
并使用两次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.