2017-01-12 9 views
0

私は<utility>をソースファイルに含めました。その後、std::exchangeを使用しましたが、コンパイラはネームスペースstdにexchangeが見つかりませんでした。私はusr/include/utilityを見て、exchangeを検索すると実装が見つかりました。それはnamespace stdブロックの中にあります。コードをコンパイルするには、std::exchangeからstd::を削除しなければなりませんでした。私のstd :: exchangeは名前空間stdにありませんか?

これを解決できますか?

どうすれば私のコードを移植可能にすることができますか?

注:AndroidのTermux Linuxエミュレータのclangを使用しています。私はaptでそれをインストールしてclangを得ました。

+1

あなたは 'C++ 14'を可能にしましたか? 'clang -std = C++ 14'? – Holt

+0

@Holt私はC++ 11を使用しています...私はそれを変更しようとします。私が言ったように、 'std ::'なしで、それは動作します。 – user6245072

+0

['cppreference'](http://en.cppreference.com/w/cpp/utility/exchange)によると' std :: exchange'はC++ 14の関数です。 clangがその前にそれを定義するだけの純粋な偶然の一致かもしれません。 – Holt

答えて

2

std::exchangeがC++ 14で導入されました。 C++ 11を使用している場合は、標準では提供されていません。

解決方法:C++ 14準拠の実装(デフォルトであるかどうかに応じて、サポートを明示的に有効にする必要があります)を使用します。

どうすればコードを移植することができますか?

自分で実装することができます。可能な実装はcppreferenceです。

template<class T, class U = T> 
T exchange(T& obj, U&& new_value) 
{ 
    T old_value = std::move(obj); 
    obj = std::forward<U>(new_value); 
    return old_value; 
} 
関連する問題