2011-04-13 63 views
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,而是让行d失败。

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

将A行变成namespace util不是一种选择,因为我不想导出新的read

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

有没有办法让这些交叉命名空间重载很好地工作?他们不应该有一个很好的理由吗?

+1

你在分解B行时有什么错误,我没有发现问题(也没有g ++ 4.4.4)。 – AProgrammer 2011-04-13 14:30:05

+0

你总是可以跳过'using namespace util;' – Puppy 2011-04-13 16:41:44

回答

3

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

你能做的最好的就是隐藏名字。你正确地雇用using(B)来解决名称隐藏所带来的复杂问题,当你也在超载函数— D应该仍然在这种情况下运作。请显示你得到的错误。

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(); 
} 
相关问题