3

次のコードをコンパイルしようとしています:

#include <iostream>
#include <memory>

struct Foo {
    Foo() { std::cout << "Foo::Foo\n"; }
    ~Foo() { std::cout << "Foo::~Foo\n"; }
    void bar() { std::cout << "Foo::bar\n"; }
};

void f(const Foo &foo)
{
    std::cout << "f(const Foo&)\n";
}

int main()
{
    std::unique_ptr<Foo> p1(new Foo);  // p1 owns Foo
    if (p1) p1->bar();

    {
        std::unique_ptr<Foo> p2(std::move(p1));  // now p2 owns Foo
        f(*p2);

        p1 = std::move(p2);  // ownership returns to p1
        std::cout << "destroying p2...\n";
    }

    if (p1) p1->bar();

    // Foo instance is destroyed when p1 goes out of scope
}

Orwell Dev-c++ 5.3.0.3 を使用すると、次のエラーが発生します。

「unique_ptr」は「std」のメンバーではありません。

どうすればこれを処理できますか?

4

2 に答える 2

11

コンパイル時に正しい -std フラグを指定していることを確認してください。Orwell Dev-C++ が使用するデフォルト設定 (-std オプションを渡さない) では、unique_ptr などの新しい C++11 関数が有効になりません。修正は非常に簡単です。

  • 非プロジェクト コンパイルの場合は、[ツール] >> [コンパイラ オプション] >> (コンパイラを選択) >> [設定] >> [コード生成] >> ([言語標準] を C++11 オプションに設定) に移動します。
  • プロジェクトのコンパイルについては、プロジェクト >> コンパイラ >> コード生成 >> (「言語標準」を C++11 オプションに設定) に移動します。

-std フラグについてもう少し詳しく説明します: http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options

ご覧のとおり、GCC はデフォルトで C++03 の GNU 方言を使用します (unique_ptr をサポートしていないようです)。

于 2012-11-29T20:44:49.343 に答える