2016-05-02 4 views
3

私は可変長のテンプレートを使用して柔軟なポインタの単純なタプルを格納するオブジェクト 'S'を持っています。 store()とstore2()の2つのメソッドがあります。最初のもの(店舗)はうまく動作します。 std :: make_tupleがエラーで失敗したので、もう一つはコンパイルされません。C++でポインタのタプルを格納するのに問題があります

make_tuple「への呼び出しに該当する機能 『』

さらにから既知の会話がないことを追加します 『のB *』には、第1引数の 'B * & &'(このエラーはタプルライブラリヘッダーの深い部分です)。

コードはここにある:

#include <tuple> 
#include <utility> 

template<typename...Rs> 
struct S 
{ 
    void store(std::tuple<Rs*...> rs) 
    { 
     rs_ = rs; 
    } 

    void store2(Rs*...rs) 
    { 
     rs_ = std::make_tuple<Rs*...>(rs...); // This is the guy that breaks 
    } 

private: 
    std::tuple<Rs*...> rs_; 
}; 

struct B 
{}; 

struct A : S<B, B> 
{}; 

int main() 
{ 
    auto *b1 = new B; 
    auto *b2 = new B; 
    auto *a1 = new A; 

    a1->store(std::make_tuple(b1, b2)); // This works 
    a1->store2(b1, b2); // How can I get this to work? 
          // (It causes an error in std::make_tuple of store2 above) 
} 
+0

FWIW、 'std :: make_tuple(rs ...);'は私のために働きます。私はエラーの説明はありません。 –

+0

ありがとう - これは私のためにも機能します。 – user5406764

答えて

6

make_tupleは、make_pair C++ 11-または-以降のように、転送の参照がかかるので、あなたが明示的に非されているテンプレートの引数を指定するときにエラーですそれらの転送参照はrvalue参照になります。

したがってmake_tuple<Rs*...>tuple<Rs*...> make_tuple(Rs*&&...)です。パラメータタイプはすべて値の参照であり、値はlvaluesにバインドされません(また、値のリストにはrs...が展開されます)。

make_meow関数の全ポイントはになります。明示的なテンプレート引数を書き出さなければならないので、書きません。

0

std::make_tuple(rs...)にそれを変更することにより、それが正常に動作しているようです...それは誤りだ理由

3

私は正確を説明することはできません(私はそれが何か疑いしかし、std::make_tupleは、明示的に指定されたテンプレート引数で呼び出されることは意図されていません(その場合は、std::tupleを使用することができますが、それらを推論したいときに使用します)。

次の二つの作品のどちらか:

rs_ = std::tuple<Rs*...>(rs...); 
rs_ = std::make_tuple(rs...); 
+1

make_tupleの型を明示的に指定することによって、転送参照のテンプレート引数型の控除が禁止されます。したがって、make_tupleのこのようなインスタンス化は、rvalue参照による引数をとります(指定された型はlvalue参照ではありません)。後でOPが左辺値を渡そうとするため、右辺値の参照に束縛されないため、エラーがポップアップします。 –

関連する問題