Приносит ли наследование от класса его в пространство имен?C++

Программы на C++. Форум разработчиков
Anonymous
Приносит ли наследование от класса его в пространство имен?

Сообщение Anonymous »

Вот пример надуманного кода:

Код: Выделить всё

template void Do(T arg) { (void)arg->b; }

namespace A {
struct Foo { int a; };
}

namespace B {
struct Foo { int b; };
struct Bar : A::Foo {
void Blah() { Do((Foo *)0); }
};
}
Который при компиляции с помощью gcc 4.8.2 (clang выдает аналогичную ошибку):

Код: Выделить всё

namespacebug.cpp: In instantiation of ‘void Do(T) [with T = A::Foo*]’:
namespacebug.cpp:10:34:   required from here
namespacebug.cpp:1:39: error: ‘struct A::Foo’ has no member named ‘b’
template void Do(T arg) { (void)arg->b; }
^
Обратите внимание на ошибку, которая относится к T = A::Foo, хотя на месте вызова я создаю Foo в пространстве имен B. Если я удалю базовый класс decl (

Код: Выделить всё

: A::Foo
), то все компилируется нормально.

Похоже, это говорит о том, что наследование от A::Foo каким-то образом переносит его в мое пространство имен и сопоставляет его с моим использованием Foo? Какая «функция» C++ вызывает это?

(Конечно, эту проблему можно легко решить, создав пространство имен при использовании Foo, но вопрос не в этом.)

Подробнее здесь: https://stackoverflow.com/questions/306 ... -namespace

Вернуться в «C++»