繁体   English   中英

C++ 友元运算符重载嵌套枚举的模板参数

[英]C++ friend operator overloading with template parameters for nested enums

我在使用嵌套枚举的模板参数重载友元按位运算符时遇到了一个问题。

最初我遇到了专有嵌入式 C++ 编译器的问题。 之后,我尝试了 gcc、clang 和 MSVC,并得到了完全相同的失败。 除了,我尝试过的任何 5.0 之前的 GCC 版本都能够编译示例代码。 使用任何编译器选择 C++ 标准似乎没有任何区别。

这是一个例子

struct Complex
{
   struct Nested1
   {
       enum ENUM
       {
          Value1_1,
          Value1_2
       };
   };

   struct Nested2
   {
       enum ENUM
       {
          Value2_1,
          Value2_2
       };
   };

   template<typename EnumL, typename EnumR>
   friend Complex operator|(const EnumL dummyL, const EnumR dummyR)
   {
        Complex dummyComplex;
        return dummyComplex;
   }
};

int main()
{
   Complex complex = Complex::Nested1::Value1_1 | Complex::Nested2::Value2_2;
}

编译器看不到运算符 | . 如果我将运算符重载移动到结构定义的正下方,则代码会编译。 虽然它不再是友元函数了。

但是,稍微不同的代码示例编译没有任何问题。

struct Complex
{
    enum ENUM1
    {
        Value1_1,
        Value1_2
    };

    enum ENUM2
    {
        Value2_1,
        Value2_2
    };

    template<typename EnumL, typename EnumR>
    friend Complex operator|(const EnumL dummyL, const EnumR dummyR)
    {
        Complex dummyComplex;
        return dummyComplex;
    }
};

int main()
{
   Complex complex = Complex::Value1_1 | Complex::Value2_2;
}

我在这里缺少什么?

原因是在第一个例子中operator| 不在定义枚举类型的类中。 因此, ADL未找到该函数(请参阅该页面第二个列表的第 4 点):

对于枚举类型的参数,将定义的枚举类型声明的最内部封闭命名空间添加到集合中。 如果枚举类型是类的成员,则将该类添加到集合中。

在上面的引用中,“set”被定义为用于查找函数的“关联的命名空间和类集”。

因此在第一个例子中没有operator| 找到它返回一个Complex类型。

移动operator| 在第一个示例中Complex类之外的重载,您将其移动到全局命名空间中。 全局命名空间始终是上述“集合”的一部分,因此会发现重载。

在第二个示例中,枚举和operator| 函数在同一个类中,所以它们被 ADL 找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM