Oto niektóre wymyślony przykład kodu:C++: Czy dziedziczenie z klasy przenosi je do przestrzeni nazw?
template<typename T> 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); }
};
}
który podczas skompilowane z gcc 4.8.2 (dzyń daje podobny błąd):
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<typename T> void Do(T arg) { (void)arg->b; }
^
notatkę w błędzie to odnosi się do T = A::Foo
nawet choć pod wywołuj strony Tworzę Foo
w przestrzeni nazw B
. Jeśli usunę dekoder klasy podstawowej (: A::Foo
), wszystkie kompilacje będą w porządku.
To wydaje się sugerować, że dziedziczenie po A::Foo
w jakiś sposób przenosi je do mojej przestrzeni nazw i dopasowuje do mojego użytku z Foo
? Co to jest funkcja C++?
(Oczywiście, problem ten może być łatwo ustalony przez przestrzenie nazw moje użycie Foo
, ale to nie jest pytanie.)
'(void) arg-> b;' - co to oznacza? –
@EdHeal, myślę, że to tylko po to, aby wymusić błąd. – StoryTeller
@StoryTeller - Więc jaki jest sens robienia głupich rzeczy? –