2013-05-05 90 views
0

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

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:\用户\ SAM \保管箱\编译项目2 \ compilerproject2 \法\ imp.h(39):错误C2473:'stmtBeginTokens':看起来像一个函数定义,但没有参数列表。

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

谢谢!

+6

是的,您应该使用C++ 11,这是自C++ 11以来支持的initializer_list。 – deepmax 2013-05-05 10:35:28

+1

@MM .:做出答案;) – 2013-05-05 10:36:24

回答

2

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

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

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

+0

从技术上讲,大括号并不意味着'initializer_list',而是使用C++ 11的统一初始化语法。只是在构造函数参数中隐式创建了'initializer_list'的情况,因为(按定义)是最好的匹配。 – Grizzly 2013-05-05 10:50:09

+0

Visual Studio没有C++ 11。我是否需要创建一个向量并将其推入一个集合? – 2013-05-05 10:55:20

+0

你有哪个版本的Visual Studio?如果它没有C++ 11,那么可以将它们推入集合中。 – deepmax 2013-05-05 11:11:25