【问题标题】:Declaring a set c++声明一个集合 c++
【发布时间】:2013-05-05 10:33:53
【问题描述】:

在这里声明一个集合有什么问题,这是我的教授代码。

set<Token> stmtBeginTokens
{
    Token::IF, Token::ID, Token::WHILE, Token::INPUT,
        Token::OUTPUT, Token::EMPTYSTMT, Token::BREAK,
        Token::RETURN, Token::HALT, Token::NEWLINE
};

稍后(供参考):

bool isSTMTBegin(Token t)
{
    return stmtBeginTokens.find(t) != stmtBeginTokens.end();
}

错误是 1>c:\users\sam\dropbox\compiler project 2\compilerproject2\lex\imp.h(39): error C2473: 'stmtBeginTokens' : 看起来像函数定义,但是没有参数列表。

我的教授使用 c++11,我有旧版本,是这个问题吗?我阅读了参考资料,但它似乎过于复杂和令人困惑。

谢谢!

【问题讨论】:

  • 是的,您应该使用 C++11,这是自 C++11 起支持的 initializer_list。
  • @MM.: 回答一下 ;)

标签: c++ set token


【解决方案1】:

你必须使用C++11来编译它,它使用initializer_list

set<Token> stmtBeginTokens { ...
                           ^ initializer_list (since C++11)

如果您的编译器支持 C++11,请使用 -std=c++11 编译选项 (gcc)。

【讨论】:

  • 从技术上讲,大括号并不表示 initializer_list,而是使用 c++11 的统一初始化语法。这只是 initializer_list 是从构造函数参数中隐式创建的一种情况,因为这是(根据定义)最佳匹配。
  • Visual Studio 没有 c++11。我需要创建一个向量并将其推入一个集合吗?
  • 您拥有哪个版本的 Visual Studio?如果它没有 C++11,是的,您可以将它们推送到集合中。
  • @MM。哪个版本都没有关系。没有版本(截至撰写本文时)可以处理此构造,因为它们都缺少std::initializer_list...
  • @rubenvb:谢谢,我从 C++11 开始就没有在 Visual Studio 中编程过,也不知道它的问题。
猜你喜欢
  • 2012-07-03
  • 2021-03-07
  • 2017-06-25
  • 2014-12-04
  • 2023-01-12
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多