【发布时间】:2014-01-26 01:29:57
【问题描述】:
考虑以下代码:
enum A : unsigned { a = 1, b = 2, c = 4 };
class B
{
friend constexpr A operator|(A a1, A a2)
{ return A(unsigned(a1) | unsigned(a2)); }
};
template <A a>
class C
{
};
int main()
{
C<a|c> c;
}
使用 g++ (4.8.1, -std=c++1) 编译时,出现以下错误:
test.C: In function ‘int main()’:
test.C:16:12: error: invalid conversion from ‘unsigned int’ to ‘A’ [-fpermissive]
C<a|c> c;
这告诉我找不到操作员。但是,如果代码改为:
enum A : unsigned { a = 1, b = 2, c = 4 };
constexpr A operator|(A a1, A a2)
{ return A(unsigned(a1) | unsigned(a2)); }
template <A a>
class C
{
};
int main()
{
C<a|c> c;
}
然后它编译并运行良好。第一种情况下的错误是编译器错误,还是我误解了什么?我想使用 Boost.Operators 的方法来轻松定义运算符,方法是通过定义运算符的模板中的基类声明一个类,但在这种情况下,这个结果排除了这种情况。
感谢您的帮助。
【问题讨论】:
-
(pure) 依赖于参数的查找(又名 Koenig 查找)依赖于参数表达式,而不是调用的上下文。您是否希望
auto x = a|c;找到在B中声明的运算符? -
你可能想解释一下你想为我们这些不熟悉 Boost.Operators 的人做些什么
标签: c++ c++11 operator-overloading