gpt4 book ai didi

c++ - 模板类中的枚举类重载operator <<

转载 作者:行者123 更新时间:2023-12-02 09:56:46 25 4
gpt4 key购买 nike

我似乎无法为模板类内的枚举类重载operator<<:

#include <iostream>

template <typename T>
struct S
{
enum class E { A, B };

E e;
};

template <typename T>
std::ostream& operator<<(std::ostream& s, const typename S<T>::E e)
{
return s << static_cast<int>(e);
}

int main()
{
const S<int> s {};
std::cerr << s.e; // error
}

Visual Studio 2015产生的确切错误消息是:
error C2679: binary '<<': no operator found which takes a right-hand operand of type 'const S<int>::E' (or there is no acceptable conversion)

gcc和clang都失败,并显示类似的错误消息。

两个注意事项:
  • 如果我将枚举类更改为纯枚举,则代码可以正常编译。
  • 如果我将operator<<重载专门用于T = int,则代码也可以正常编译。

  • 我想念什么?

    最佳答案

    您的运算符模板无法推断出T,因为它在::之前使用(请考虑对S类型进行特化S::E可能会做什么)。使用无范围的枚举时,您将通过隐式转换为整数来获得标准重载之一。

    这里常用的方法是将运算符定义为(非模板) friend 。然后,重载解析(而不是模板自变量推导)负责在它们之间进行选择。

    关于c++ - 模板类中的枚举类重载operator <<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59445839/

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