Приносит ли наследование от класса его в пространство имен?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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