2014-03-25 11 views
17

ich ein Problem mit einem Namespace namens „Ausnahme“Namespace genannt ‚Ausnahme‘ führt Probleme zu kompilieren

Lassen Sie uns folgende Beispiel-Header betrachten:

#include <exception> 

namespace exception 
{ 
    struct MyException : public std::exception 
    {}; 
} 


struct AnotherException : public exception::MyException 
{ 
    AnotherException() : exception::MyException() { } 
}; 

Dieser Header mit folgendem Fehler nicht kompilieren:

 

    namespacetest.hpp: In constructor 'AnotherException::AnotherException()': 
    namespacetest.hpp:12:48: error: expected class-name before '(' token 
    namespacetest.hpp:12:48: error: expected '{' before '(' token 

Es gibt zwei Lösungen:

1) qualifiziere den Namespace mit "::" in Zeile 12

2) Namespace in z. "exceptional"

Was ist der Grund, dass der Namespace "Exceptions" zu Verwirrung führt? Ich weiß, dass es eine Klasse std :: exception gibt. Ist das der Grund für das Problem?

Antwort

22

I know that there is a class std::exception . Does this cause the trouble?

Ja. Innerhalb std::exception ist der unqualifizierte Name exception der Name der injizierten Klasse. Dies wird so vererbt, dass sich innerhalb Ihrer Klasse ein nicht qualifizierter exception darauf bezieht, nicht Ihr Namespace.

+2

Fühlt sich gut an, ein +1 zu bekommen, sobald du die Antwort postest? :) – jrok

+0

+1 für das Sprichwort "injiziert" –

10

+1 auf @Mike Seymours Antwort! Als Ergänzung gibt es bessere Möglichkeiten als die aktuelle Lösung, die Mehrdeutigkeit zu verhindern:

Nur MyException verwenden, ohne Namespace-Qualifikation:

struct AnotherException : public exception::MyException 
{ 
    AnotherException() : MyException() { } 
}; 

LIVE EXAMPLE

oder C++ 11 geerbt Konstrukteure verwenden Feature:

struct AnotherException : public exception::MyException 
{ 
    using MyException::MyException; 
}; 

LIVE EXAMPLE

Verwandte Themen