2014-03-25 82 views
17

我有一個所謂的「例外」命名空間的問題命名空間稱爲「異常」會導致編譯問題

讓我們看看下面的例子標題:

#include <exception> 

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


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

這頭不與下面的錯誤編譯:

 

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

這有兩種解決方案:

1)在第12行用「::」限定命名空間

AnotherException() : ::exception::MyException() { } 

2)將命名空間重命名爲例如「例外」

是什麼原因,命名空間「異常」導致混淆?我知道有一個類std :: exception。這是否會造成麻煩?

回答

22

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

是的。在std::exception內,不合格名稱exception注入類名稱。這是繼承的,所以在你的班級中,一個不合格的exception指的是,而不是你的名字空間。

+2

感謝您在發佈答案的那一刻獲得+1的結果? :) – jrok

+0

+1表示「注入」 –

10

+1 @Mike Seymour的回答!作爲補充,還有比當前解決方案更好的方法來防止歧義:

只需使用MyException,沒有任何名稱空間限定:

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

LIVE EXAMPLE

或者使用C++ 11的遺傳構造特點:

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

LIVE EXAMPLE