2016-06-07 127 views
1

我刚刚在unix中写了一个cpp文件。 我有一堆使用嵌套模板参数的代码。 例如:在unix中编译C++时嵌套模板参数出错

void showAlb(map<string, vector<string>> mapArt, map<string, vector<string>> mapSong, vector<string> artists, int artnumb); 

不过,我总是得到错误 `

error: ?>?should be ? >?within a nested template argument list

`

void showAlb(map<string, vector<string>> mapArt, map<string, vector<string>> mapSong, vector<string> artists, int artnumb);` 
           ^

我怎样才能解决呢?

+0

正如答案中所提到的,您可能会喜欢使用C++ 11。假设最近有足够的g ++版本,可以通过在编译命令行中添加-std = C++ 11来编译使用C++ 11规则。 – md5i

回答

1

预C++ 11,嵌套模板参数必须有两个闭合尖括号之间的空间:

map<string, vector<string> > 
//     here^ 

C++ 11可略过该空间。如果你坚持使用C++ 03,只要确保遵循特定的语法规则。

0

有两件事可以解决这个问题。您可以切换到C++ 11,在此得到支撑的,或者你可以做什么错误消息告诉你做的事:

void showAlb(map<string, vector<string>> mapArt, map<string, vector<string>> mapSong, vector<string> artists, int artnumb); 

应该是:

void showAlb(map<string, vector<string> > mapArt, map<string, vector<string> > mapSong, vector<string> artists, int artnumb); 

的通知额外的空间。

这种奇怪行为的原因是>>是它自己的操作符。 C++解析器第一遍(即 - 词法分析)将此解析为该运算符,而不是两个>。这意味着在搜索终止角括号时,上下文无关语法分析没有任何用处。

问题很普遍,C++ 11添加了一个明确的规则来允许这样做。编译器明白这一点,并为您提供出色的错误信息。

+0

谢谢,这真的很有帮助。 – RunningPig