Bry*_*Fry 5 c++ operator-overloading c++11
请考虑以下代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
使用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;
Run Code Online (Sandbox Code Playgroud)
这告诉我没有找到运营商.但是,如果代码更改为:
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;
}
Run Code Online (Sandbox Code Playgroud)
然后它编译并运行正常.第一种情况下的错误是编译器错误,还是我误解了什么?我想使用Boost.Operators的方法通过从定义运算符的模板声明一个带有基类的类来轻松定义运算符,但是这个结果排除了这种情况.
谢谢你的帮助.
解决这个问题的另一种方法(除了已经提到的 jogojapan 之外)是简单地在作用域之外声明友元函数。
enum A : unsigned { a = 1, b = 2, c = 4 };
//declaration
constexpr A operator|(A a1, A a2);
class B
{
//definition inside, ok.
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;
}
Run Code Online (Sandbox Code Playgroud)