Hier einige erfundene Beispiel Code:C++: Erbt es von einer Klasse es in den Namespace?
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); }
};
}
die, wenn sie mit gcc 4.8.2 (Klirren gibt einen ähnlichen Fehler) zusammengestellt:
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; }
^
Hinweis in den Fehler es bei der zu T = A::Foo
selbst bezieht sich allerdings Call-Site Ich erstelle eine Foo
in Namespace B
. Wenn ich die Basisklasse decl (: A::Foo
) entferne, dann kompiliert alles gut.
Dies scheint darauf hinzudeuten, dass die Erben von A::Foo
bringt es irgendwie in meinen Namespace und passt es an meine Verwendung von Foo
? Was bewirkt C++ "feature"?
(Natürlich kann dieses Problem leicht durch meine Namensräume Verwendung von Foo
festgelegt werden, aber das ist nicht die Frage.)
'(void) arg-> b;' - was bedeutet das? –
@EdHeal, ich denke, das ist nur da, um den Fehler zu erzwingen – StoryTeller
@StoryTeller - Also, was ist der Sinn dumm zu machen? –