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

Posted

技术标签:

【中文标题】特定于 gcc 4.5 的 C++ 数组创建问题【英文标题】:C++ array creation problem specific to gcc 4.5 【发布时间】:2011-02-07 19:35:33 【问题描述】:

以下代码适用于 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++。

【问题讨论】:

vector pass (10);或者不指定初始大小(如果您愿意,仍可调用 Reserve)。 @Fred, vector 非常适合新代码,我会全心全意地推荐它,但在这种工作代码被不太理解的人修改的特定情况下,恐怕它是错误的答案。 @MarkRansom:这是评论而不是答案是有原因的。 :) 但是向量(尤其是具有连续性要求的)通常是 new[]/delete[] 的直接替代品,并且本地更改最少。 见gcc.gnu.org/bugzilla/show_bug.cgi?id=46159 【参考方案1】:
Pass** passes = new Pass*[10];

【讨论】:

【参考方案2】:

我认为这样做可以:

typedef Pass * PassPtr;
Pass **passes = new PassPtr[10];

【讨论】:

是的,但除非您有真的充分的理由这样做,否则不要 [使用 typedef 来“隐藏”指针类型]。 @eq,“只知道有限的 C++”的人可能是一个很好的理由 - typedef 分解了表达式并使其更容易理解。特别是如果 typedef 和它的使用是相邻的代码行。【参考方案3】:

我不明白你为什么这么想包装它。

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

这样不行吗?

【讨论】:

确实如此。我不确定为什么这段代码的原始作者让它变得如此复杂,但感谢大家的快速修复。【参考方案4】:

您使用的多余括号现在使编译器看起来好像您正在传递一个将 lambda 作为参数传递的构造函数。 Lambda 是 C++0x 中的新增功能,这就是为什么这个错误只在新编译器中出现的原因。您可以改用Pass** passes = new Pass*[10]; 来修复它。

【讨论】:

以上是关于特定于 gcc 4.5 的 C++ 数组创建问题的主要内容,如果未能解决你的问题,请参考以下文章

c++ 中是不是有类似 java 中的 Desktop 类的类? (特定于 Windows)

[][] 的含义是特定于上下文的吗?

Visual C++ 等效于 GCC 实验性并行 for_each?

在构建我的 C++ 可执行文件 (gcc) 时,我可以获得所有链接库的报告吗? (包括静态链接)

为 Mac 生成特定于机器的密钥

为什么在创建特定于x86_64的共享对象时“无法使用R_X86_64_32”的CMake解决方案?