Перегрузка функции-члена на основе типов примитивов с определенными пространствами имен

0

Следующий код не скомпилирован с 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 и фокусируется на базовом типе, и он сталкивается.

Я прав? У вас есть обходной путь?

Теги:
namespaces
overloading
typedef

2 ответа

2

Типы не живут в пространствах имен. Имена действительно. Вы перегружаете типы, а не имена.

  • 0
    Поправьте меня, если я ошибаюсь, но у типов есть имя, и, следовательно, оно также живет в пространстве имен, не так ли?
  • 1
    @Davidbrcz: Вы ошибаетесь. Типы могут иметь более одного имени; это то, что делает typedef.
Показать ещё 2 комментария
1

typedef - это просто другое имя для того же типа. Вы можете перегружать только разные типы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню