2014-01-10 60 views
2

我是問題的OP:Extending a class其中我收到了很好的答案。然而,當我嘗試編譯代碼(我的項目略有返工)我收到以下消息(線沒有改變,以反映下面的示例代碼。):編譯器錯誤預期的嵌套名稱說明符

except.h: | 09 | expected nested-name-specifier before ‘handler_t1’ 

還有更多沿着這似乎從這個幹線。我是C++的新手,我對這個答案的研究(以及即將出現的問題)產生了這樣一個事實:微軟的編譯器似乎接受了代碼,但符合標準的代碼卻沒有。

因爲我現在有它的代碼如下:

#include <vector> 
namespace except 
{ 
    // several other classes and functions which compile and work already 
    // (tested and verified) have been snipped out. Entire code is over 
    // 1000 lines. 

    class Error_Handler 
    { 
    public: 
     using handler_t1 = bool (*)(except::Logic const&); 
     std::vector<handler_t1> logic_handlers; 

     // a lot more removed because the error has already happened ... 
    } 
} 

A至鏈接問題的代碼的讀取指示給我(我有限的知識),它應該所有的工作。

因此,我的問題是:在此聲明/定義中需要更改哪些內容才能使用gcc編譯(4.6.3 64位Linux編譯時使用-std = C++ 0x)?

+0

我不太瞭解C++ 11,但這有幫助嗎? http://en.cppreference.com/w/cpp/language/type_alias –

回答

5

GCC 4.6.3不支持C++ 11類型別名:using handler_t1 = bool (*)(except::Logic const&);。非模板類型別名相當於typedefs:typedef bool (*handler_t1)(except::Logic const&);。替換它們,看看是否有幫助。

甚至更​​好,升級到更新的編譯器版本。我相信這裏的常規響應者傾向於寫入由GCC 4.8編寫的語言部分。

編輯:我在答案中看到的唯一的其他iffy功能是基於範圍的,因爲我相信GCC在4.6中增加了支持。使用typedefs替換類型別名後,您應該可以。

+1

我找到了相關的標準報價。 '7.1.3.2 typedef-name也可以通過別名聲明引入。 using關鍵字後面的標識符變爲typedef-name,標識符後面的可選attribute-specifier-seq屬於該typedef-name。它具有與typedef說明符所引入的相同的語義。特別是,它沒有定義一個新的類型,它不應該出現在type-id中。此外,http://gcc.gnu.org/gcc-4.6/cxx0x_status.html。你會在'template alises'旁邊看到一個很大的紅色。 – 2014-01-10 04:26:31

+0

@casey非常感謝。解決了整個問題! – Jase

+0

@remyabel很好的參考。作爲C++的新手,我不知道不同的編譯器需要不同的語法,或者提供了不同的功能集。 – Jase

1

我也遇到同樣的問題,只需在Ubuntu中升級到G ++ 4.8即可解決。

我假設你已經有GCC,最簡單的方法可以增加PPA到您的存儲庫和更新的前一版本和升級,你可以擁有最新版本的無後顧之憂:

sudo的增加,容易-repository PPA:Ubuntu的工具鏈-R /測試

sudo易於得到更新

這將增加新的PPA到其他來源。

然後反安裝替代:

須藤更新替代品--remove-所有的gcc

須藤更新替代品--remove-所有克++

然後:

sudo apt-get install gcc-4.8

sudo apt-get install g ++ - 4。8

並且作爲替代包安裝:

須藤更新替代品--install的/ usr /斌/ GCC GCC /usr/bin/gcc-4.8 20

須藤最新情況:替代--install的/ usr /斌/克++ G ++ /usr/bin/g++-4.8 20

須藤更新替代品--config GCC

須藤更新替代品--config克++

末:

sudo易於得到更新

sudo易於得到升級-y

sudo易於得到的dist-升級

希望這改變了--version;)

0

使用版本6之前的g ++,您需要使用--std=c++11選項才能使用using指令。

相關問題