基于命名空间类型和primitif类型的成员函数重载



以下代码在C++03和C++11 中都无法使用g++4.8进行编译

namespace N {typedef int A;}
namespace NN {typedef int A;}
struct Z
{
    void foo(N::A){}
    void foo(NN::A){}
};

错误为

d.cpp:7:10: erreur: ‘void Z::foo(NN::A)’ cannot be overloaded
     void foo(NN::A){}};
          ^
d.cpp:6:6: erreur: with ‘void Z::foo(N::A)’
 void foo(N::A){}

我一直认为不同名称空间中的类型是不同的类型,不管怎样。但事实似乎并非如此。我觉得编译器在最后摆脱了名称空间/typedef,专注于底层类型,结果发生了冲突。

我说得对吗?你有变通办法吗?

类型不存在于名称空间中Names确实如此。你重载的是类型,而不是名称。

typedef只是同一类型的另一个名称。只能在不同类型上重载。

最新更新