gpt4 book ai didi

c++ - 在类模板的成员枚举上重载运算符

转载 作者:行者123 更新时间:2023-11-28 02:27:14 24 4
gpt4 key购买 nike

我想为类模板中的enum 重载operator | 的模板。

这是一个最小的例子:

#include <iostream>
using namespace std;

template <class T>
struct test1 {
enum test2 {
test3, test4
};
};

template <class T>
typename test1<T>::test2 operator | (typename test1<T>::test2 f1, typename test1<T>::test2 f2) {
return static_cast<typename test1<T>::test2>(
static_cast<unsigned>(f1) | static_cast<unsigned>(f2)
);
}

int main() {
test1<int>::test2 flags = test1<int>::test3 | test1<int>::test4; // error here
}

Live example.

编译器在此代码中显示以下诊断信息:

In function 'int main()':
error: invalid conversion from 'int' to 'test1<int>::test2' [-fpermissive]
test1<int>::test2 flags = test1<int>::test3 | test1<int>::test4;

我还尝试用 LLVM 6.1.0 编译这段代码。

这段代码有什么问题?

最佳答案

问题是在typename test1<T>::test2 , 模板参数 Tnon-deduced context , 所以 C++ 不能从函数参数的类型推导出它的模板参数。

您可以通过显式实例化函数模板来看到这一点:

test1<int>::test2 flags = operator | <int> (test1<int>::test3, test1<int>::test4);

DEMO

或者使用类模板的非模板友元函数:

template <class T>
struct test1 {
enum test2 {
test3, test4
};
friend test2 operator | (test2 f1, test2 f2) {
return static_cast<test2>(
static_cast<unsigned>(f1) | static_cast<unsigned>(f2)
);
}
};

int main() {
test1<int>::test2 flags = test1<int>::test3 | test1<int>::test4;
}

DEMO

另见:

关于c++ - 在类模板的成员枚举上重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30110336/

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