跨名称空间重载函数是否一定很困难?

| 我一直在用这种结构写一些代码
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行,否则C行不会编译,但这会使D行失败。 由于参数数量不同(直到C ++ 0x),无法对util :: read模板进行专门化。 将行A转换为
namespace util
是不可行的,因为我不想导出新的
read
。 我可以重命名
read(MyType&,int)
,但那会破坏ahem风格。 有没有一种方法可以使这些跨命名空间的重载正常工作?他们不应该有充分的理由吗?     
已邀请:
是的,很难。实际上,这是不可能的。 最好的办法是隐藏名称。您还可以使用
using
(B)来解决隐藏名称带来的复杂问题,同时还需要重载函数,在这种情况下D仍应起作用。请显示错误信息。     
不同的名称空间意味着它们中包含的标识符的全名不同,因此它们不会彼此重载(至少对于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 ();
}
    

要回复问题请先登录注册