【问题标题】:C++ Move constructor won't compileC ++ Move构造函数不会编译
【发布时间】:2013-09-30 12:47:14
【问题描述】:

我有一个不幸的问题。我的 GCC 4.6.3 编译器拒绝编译我的移动构造函数。 将示例中的第 6 行替换为“MemoryBlock(const MemoryBlock & other)”将使其编译,但不使用下面的移动构造函数声明。似乎编译器不知道 C+11,即使它应该使用 4.6.3。对吧?

#include <cstddef>

class MemoryBlock
{
public:
   MemoryBlock(MemoryBlock && other) //<----------- RAD 6.
    {
    }

private:
   size_t _length; // The length of the resource.
   int* _data; // The resource.
};

int main() {

}

编译器输出:

prog.cpp:6:28: 错误:在“&&”标记之前需要“,”或“...”

prog.cpp:6:36: 错误:无效的构造函数;您的意思可能是“MemoryBlock (const MemoryBlock&)”

make: * [slask] 错误 1

GCC 版本:

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 (Kör från labbsal i skolan)

制作文件:

%.out:    %.cpp
    g++ -g -W -Wall -std=c++0x $*.cpp -o $*.out;

【问题讨论】:

  • 在我的 GCC 4.6.3 上运行良好。确保您实际上使用的是正确的版本;可能不用makefile直接在命令行上检查。
  • 我确实验证了我的版本 (g++ --version) 及其正确性。但是,你是对的,它有效。问题似乎出在我的makefile中。非常感谢!我的 makefile 看起来很简单,以至于我并不认为这是一个问题。知道使用这个 makefile 可能会出现什么问题吗?
  • 您的 makefile 可能没有使用您指定的规则,而是使用默认规则。
  • 您可以通过设置CXXFLAGS 并让默认规则发挥作用,大大简化小代码示例的makefile。
  • 事实上,我越看它,就越觉得那个makefile 的一切都错了。也许拿起一个 Makefile 教程,慢慢地,一步一步地工作。尤其是替换规则和魔术变量应该仔细检查。

标签: c++ c++11 compiler-construction move


【解决方案1】:

尝试使用 -std=c++11 而不是 -std=c++0x。虽然您的编译器知道用法,但 -std=c++0x 会“关闭”这些新规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多