跨命名空间重载函数必须很难吗?

4

我一直在使用基本上这种结构编写代码

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 ();
}

起初,如果不将其完全限定为util :: read(i)或取消注释B行,则C行无法编译,但这会导致D行失败。
由于参数数量不同(直到C ++ 0x),无法专门化模板util :: read。
将A行转换为namespace util 不是一个选项,因为我不想导出新的read
我可以重命名read(MyType&,int),但这会破坏风格。
有办法使这些跨命名空间的重载正常工作吗?它们不应该有很好的理由吗?

1
当你取消注释B行时,你遇到了什么错误?我没有发现任何问题(g++ 4.4.4也没有)。 - AProgrammer
你可以随时跳过 using namespace util; - Puppy
2个回答

3

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

最好的办法就是隐藏名称。当您还要重载函数时,您可以使用 using (B) 来避免名称隐藏带来的混乱 — 在这种情况下,D 应该仍然能够正常工作。请展示您得到的错误信息。


0
不同的命名空间意味着它们包含的标识符具有不同的完整名称,因此它们彼此之间不是重载(至少对于微软的编译器和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 ();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接