是否必须在命名空间中重载函数?

时间:2011-04-13 14:21:07

标签: c++ coding-style namespaces overloading

我一直在用基本结构编写一些代码

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失败。

不能使用模板util :: read,因为参数的数量不同(直到C ++ 0x)。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

不同的命名空间意味着包含在其中的标识符的不同全名,因此它们不会相互重载(至少对于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 ();
}