Следующий код не скомпилирован с g++ 4.8, как в С++ 03, так и в С++ 11
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 и фокусируется на базовом типе, и он сталкивается.
Я прав? У вас есть обходной путь?
Типы не живут в пространствах имен. Имена действительно. Вы перегружаете типы, а не имена.
typedef
- это просто другое имя для того же типа. Вы можете перегружать только разные типы.