7

リポジトリから入手可能な最新の GCC ビルドを使用しています。追加の C++0x 機能があるため、これを使用することにしました。しかし、今はうまくいくと思われるものに固執しました-r値を介してマップする新しい要素を追加したいです。問題を示す簡略化されたコード:

#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クラスをコードのようなプリミティブ型に置き換えるとint、コンパイルして問題なく動作することに注意してください。

私の製品コードでは、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++ のバグであることを確認したいと思います。

4

2 に答える 2

5

tr1 の使用を除いて、あなたのコードは私には正しいように見えます。tr1 修飾されたものは、右辺値参照または移動セマンティクスについて知りません。

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

于 2011-01-26T21:09:20.073 に答える
0

そのvalue_typeunordered_mapはありませんstd::pair<int, X>。ですstd::pair<const int, X>。そのタイプを使用すると、valueよりうまく機能するかもしれません。

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

あなたのコードがそのままでは機能しない理由は正確にはわかりませんが。

于 2011-01-26T21:08:24.037 に答える