特定于gcc 4.5的C++数组创建问题

3
以下代码可以在gcc 2.9到4.4版本下运行,但无法在4.5版本下运行:
 struct Pass {
 };

 int main(void){
 Pass **passes = new ( Pass (*[ 10 ]) );
 }

使用gcc 4.5时出现的具体错误信息是:

prob.cc: In function ‘int main()’:
prob.cc:6:31: warning: lambda expressions only available with -std=c++0x or -std=gnu++0x
prob.cc:6:38: error: no matching function for call to ‘Pass::Pass(void (&)())’
prob.cc:2:1: note: candidates are: Pass::Pass()
prob.cc:2:1: note:                 Pass::Pass(const Pass&)

在添加所请求的标记后,初始警告将被静默,但这并不能解决问题。 有人能否解释一下如何解决这个问题?这段话来自我正在维护的一些晦涩的C ++代码,而我只了解有限的C ++知识。


1
vector<Pass*> passes (10); 或者不指定初始大小(如果喜欢,仍然可以调用reserve)。 - Fred Nurk
@ Fred,vector 对于新代码来说非常好,我全力推荐它,但是在这种特定情况下,由不太理解它的人修改已有代码,恐怕这不是正确的答案。 - Mark Ransom
@MarkRansom:这就是为什么它是一个评论而不是答案的原因。:) 但是,向量(尤其是其连续性要求)通常可以作为new[]/delete[]的替代品,只需进行最少的本地更改即可。 - Fred Nurk
请参见http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46159。 - Johannes Schaub - litb
4个回答

5
Pass** passes = new Pass*[10];

3
我想这样做可以解决问题:
typedef Pass * PassPtr;
Pass **passes = new PassPtr[10];

3
是的,但除非你有非常好的理由这样做,否则不要使用typedef来“隐藏”指针类型。 - eq-
@eq,一个只“知道有限的C ++”的人可能是一个非常好的理由 - typedef会分解表达式,使其更容易理解。特别是如果typedef和使用它的代码行相邻。 - Mark Ransom

2
我不明白为什么你要这么包装它。
Pass** passes = new Pass*[10];

这不起作用吗?


确实如此。我不确定原始代码的作者为什么要把它做得比这更复杂,但感谢大家快速修复。 - Nathan Dunfield

1
你现在使用的多余括号让编译器认为你正在传递Pass的构造函数作为参数的lambda表达式。Lambda表达式是C++0x中的新加入,这就是为什么这个错误只在新编译器中出现的原因。你可以通过使用Pass **passes = new Pass *[10];来解决它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接