2

私はexplicitly instantiate a variadicコンストラクタにしようとしています。この最小限の例をprint all argumentsにすると、GCC 5.3で64ビットのWin 7でMinGW-w64が表示されるのと同じエラーが発生します。variadicコンストラクタを明示的にインスタンス化しています:template-idがテンプレート宣言と一致しません

struct stf { 
template<typename... Args> stf(Args&&... args){ 
    using expand_type = int[]; 
    expand_type{(print(args), 0)... }; 
} 
}; 

//error on next line: 
//template-id 'stf<char*, char*>' for 'stf::stf(char*, char*)' 
//does not match any template declaration 
template stf::stf<char*,char*>(char*,char*); 

答えて

3

のは一瞬のために、パラメータパックを無視してみましょう:

template<typename Arg> stf(Arg &&args) 

ポップクイズ:インスタンス化は、上記のテンプレートと一致します。それは次のとおりです。

template<char *> stf(char *); 

または

template<char *> stf(char *&&); 

char *をテンプレートのどこに置き換えても、2番目のバージョンが正しい答えになることは明らかです。

したがって、正しいテンプレートのインスタンスでなければなりません:

template stf::stf<char*,char*>(char* &&,char* &&); 
+0

あなた@Samをありがとうございます。私はコンストラクタからの引数を転送しようとしていたので、私は先例転送の例(上にリンクされていない)を見つけ、次に他の2つの例を見つけました。すべてをまとめてみると、xvalueの参照はパラメータパックの必須の機能ではないことに気づきませんでした。私の防衛では、私は機械工学者に過ぎず、私は数年前に書きました古いコードを修正するために戻っています: - P –

関連する問題