2011-01-26 23 views
7

リポジトリから最新のGCCビルドを使用しています。私はそれを使用することを決めたのは、C++ 0xの追加の機能がいくつかあるからです。しかし、今私は何か動作すると思う何かにこだわりました - 私はr値を介してマップする新しい要素を追加したいです。問題を示し簡体コード:intコードコンパイルし、うまく動作するようないくつかのプリミティブ型でXクラスを置き換えることR値の挿入がunordered_mapで機能しない

#include <tr1/unordered_map> 

class X 
{ 
    public: 
     X (void) { /* ... */ }; 
     X (const X& x) = delete; 
     X (X&& x) { /* ... */ }; 
}; 

int main (void) 
{ 
    std::tr1::unordered_map<int, X> map; 

    // using std::tr1::unordered_map<int, X>::value_type didn't help too 
    std::pair<int, X> value (1, X()); 

    map.insert (std::move (value)); 
} 

お知らせ。

私の生産コードクラスでは、Xに対応するコピーコンストラクタもありません。

エラーメッセージは(すべてのテンプレート関連のエラーと同様に)長くて読めなくなります。ここに入れるのが良いかどうかはわかりません。エラーメッセージが必要な場合は通知してください。この質問を更新します。メッセージの最後の部分は興味深いです:

(...) 
/usr/include/c++/trunk/ext/new_allocator.h:106:9: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, _T2 = X, std::pair<_T1, _T2> = std::pair<const int, X>]’ 
In file included from /usr/include/c++/trunk/utility:71:0, 
       from /usr/include/c++/trunk/tr1/unordered_map:34, 
       from kod.cpp:1: 
/usr/include/c++/trunk/bits/stl_pair.h:110:17: error: ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, _T2 = X, std::pair<_T1, _T2> = std::pair<const int, X>]’ is implicitly deleted because the default definition would be ill-formed: 
/usr/include/c++/trunk/bits/stl_pair.h:110:17: error: use of deleted function ‘X::X(const X&)’ 

また、これは動作するはずです、同様のバグがすでに[C++0x] Implement emplace* in associative and unordered containersを固定したため。

多分私は何か間違っていますか?私はそれを報告する前にGCCまたはlibstdC++のバグを確認したい。

+0

リリースされていないR-Value互換の 'insert'メソッドが、リリースされていないGCC 4.6.0で利用できるようになりました。 – Goofy

答えて

5

あなたのコードはtr1の使用を除いて私に似ています。 tr1で修飾されたものは、rvalue参照または移動セマンティクスについては認識しません。

あなたのコードを取り出し、ヘッダと名前空間の修飾子からtr1を削除し、g ++ - 4.4とlibC++(http://libcxx.llvm.org/)を使ってコードをコンパイルしました。 tr1を削除してみてください。

+0

TR1の機能のいくつかを使用しようとしていたときに、コンパイラが以前「tr1」名前空間を使用するように強制しました... – Goofy

+2

tr1は非規範的な技術レポートを指します。つまり、その中の機能はオプションとみなされます。標準ではその機能は必要ありません。 tr1には、後でC++ 0xに移動されたライブラリコンポーネントの多くが含まれていました。場合によっては、std :: tr1からstd ::への移行中に、コンポーネントが変更されました。 unordered_mapに移動セマンティクスを追加することは、そのような変更の例です。 tr1はC++ 0xに先行します。あなたはtr1を持っていたが、C++ 0xの機能を持たないバージョンを使っているかもしれません。 –

+0

(遅れて)ようこそSO :) –

0

unordered_mapvalue_typeは、std::pair<int, X>ではありません。 std::pair<const int, X>です。もしあなたがvalueのためにそのタイプを使用すれば、よりうまくいくでしょう。

decltype(map)::value_type value(1, X()); 
map.insert(std::move(value)); 

私はあなたのコードがそのまま動作しない理由を正確には見ていませんが、

関連する問題