2014-01-10 61 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指令。

相关问题