gpt4 book ai didi

c++ - Koenig 查找是否应该找到具有枚举参数的类中的友元运算符?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:43 24 4
gpt4 key购买 nike

考虑以下代码:

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;

这告诉我找不到运算符(operator)。但是,如果将代码更改为:

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 的方法通过从定义运算符的模板中声明一个带有基类的类来轻松定义运算符,但在这种情况下,这个结果排除了这一点。

感谢您的帮助。

最佳答案

解决它的另一种方法(除了已经提到的 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;
}

关于c++ - Koenig 查找是否应该找到具有枚举参数的类中的友元运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21358515/

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