代码之家  ›  专栏  ›  技术社区  ›  Praetorian Luchian Grigore

非成员运算符重载应该放在哪里?

  •  15
  • Praetorian Luchian Grigore  · 技术社区  · 14 年前

    我想超载 operator<< 为了我的班级。我应该将这个重载定义添加到 std 命名空间?(自从 ostream operator<< 是其中的一部分 性病 命名空间)还是应该将其保留在全局命名空间中?

    简而言之:

    class MyClass {
    
    };
    
    namespace std {
        ostream& operator<< ( ostream& Ostr, const MyClass& MyType ) {}
    }
    

    class MyClass {
    
    };
    
    std::ostream& operator<< ( std::ostream& Ostr, const MyClass& MyType ) {}
    

    哪个更合适,为什么?提前感谢您的回复。

    3 回复  |  直到 14 年前
        1
  •  27
  •   James McNellis    14 年前

    应该将运算符重载放在与类相同的命名空间中。

    这将允许在重载解析期间使用依赖于参数的查找找到运算符(实际上,因为 ostream 在命名空间中 std ,如果将重载放到命名空间中,也会找到它。 性病 但没有理由这样做)。

    从良好设计实践的角度来看,运算符重载更多地是类接口的一部分,而不是 溪流 ,因此它与类属于同一名称空间(另请参见Herb Sutter的 Namespaces and the Interface Principle )

    从编写标准兼容和可移植代码的角度来看,不能将运算符重载放到命名空间中。 性病 . 同时可以将用户定义实体的模板专用化添加到命名空间中 性病 ,不能添加其他函数重载。

        2
  •  7
  •   Sam Miller    14 年前

    不要添加到 std 名称空间,将其放置在与类相同的名称空间中。名称空间的目的是防止冲突。标准规定

    17.4.3.1保留名称

    对于C++程序来说,它是未定义的。 向添加声明或定义 命名空间std或命名空间 命名空间标准,除非另有说明 明确规定。程序可以添加模板 任何标准的专业化 命名空间标准的库模板。 这样的专业(完全或 标准库的部分) 模板导致未定义的行为 除非声明取决于 外部链接的用户定义名称 除非专业化 标准图书馆的要求 原始模板。

        3
  •  6
  •   Carl    14 年前

    不要添加到标准命名空间。 原因:如果每个人都这样做,标准名称空间会有大量的名称冲突,这会破坏名称空间的目的。

    你的目标是让你的班级“可以被排斥”。这样做不需要在标准名称空间中。只要它是在任何名称,你的类是声明在,你是好的。把它放在标准名称空间中是不好的做法。