【问题标题】:Does it have to be hard to overload functions across namespaces?跨命名空间重载函数是否一定很困难?
【发布时间】:2011-04-13 14:21:07
【问题描述】:

我一直在写一些基本上是这种结构的代码

namespace util {
    void read (int &);
    template <typename T>
    void read (T &);
}

void foo ();

using namespace util;

namespace { // A
    void read (MyType &, int);

    void do_something () {
        MyType t;
        int i;
        // using util::read; // B
        read (i); // C
        read (t,i); // D
    }
}

void foo () {
    do_something ();
}

在第一行 C 没有编译,除非我将其完全限定为 util::read(i) 或未注释的 B 行,但这会使 D 行失败。

由于参数的数量不同(直到 C++0x),所以无法专门化模板 util::read。

将 A 行转换为 namespace util 不是一个选项,因为我不想导出新的 read

我可以重命名 read(MyType&amp;,int),但这会破坏 ahem 风格。

有没有办法让这些跨命名空间重载工作得很好?他们不应该有充分的理由吗?

【问题讨论】:

  • 取消 B 行的注释时有什么错误。我认为它没有问题(g++ 4.4.4 也没有)。
  • 你总是可以跳过using namespace util;

标签: c++ coding-style namespaces overloading


【解决方案1】:

是的,这很难。事实上,这是不可能的。

你能做的最好的就是隐藏名字。当您还重载函数时,您使用using (B) 来解决名称隐藏带来的复杂性是正确的——在这种情况下,D 应该仍然起作用。请显示你得到的错误。

【讨论】:

    【解决方案2】:

    不同的命名空间意味着其中包含的标识符的不同全名,因此它们不会相互重载(至少对于 Microsoft 的编译器和 GCC - 我不确定标准是如何定义的)。

    试试这个:

    namespace util {
        void read (int &);
        template <typename T>
        void read (T &);
    }
    
    void foo ();
    
    namespace { // A
        using ::util::read;
        void read (MyType &, int);
    
        void do_something () {
            MyType t;
            int i;
            // using util::read; // B
            read (i); // C
            read (t,i); // D
        }
    }
    
    void foo () {
        do_something ();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 2011-03-08
      • 2022-01-16
      • 2017-03-19
      • 1970-01-01
      • 2011-05-25
      相关资源
      最近更新 更多