特定于 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++。
【问题讨论】:
vectorvector
非常适合新代码,我会全心全意地推荐它,但在这种工作代码被不太理解的人修改的特定情况下,恐怕它是错误的答案。
@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?