2017-03-12 11 views
0

gcc-5.4.0は、関数の引数リストの最後に表示されない場合、パラメータパックを推論できないのはなぜですか? worksへのコールはworks<int,int,int>に正しく導かれますが、failsへのコールは推測されませんが、空のパラメータパックのみが使用されます。関数の提供された引数が多すぎるというエラーメッセージが表示されます。控除対象外のパラメータパック

#include <iostream> 

template <typename...args_t> 
void works (int first, args_t...args) { 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
} 

template <typename...args_t, typename last_t, typename=void> 
void fails (args_t...args, last_t last) { 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
} 

int main() { 
    works (0, 1, 2, 3); 
    fails (0, 1, 2, 3); 
    return 0; 
} 

編集:答えは説明したように、パラメータパックの後に型名を持つことが許されていません。しかし、cppreference.comによれば、それが演繹される可能性がある場合は、後に他のテンプレートパラメータを持つことが有効である必要があります。明らかに、与えられた例は私のgccでコンパイルされません。代わりに、あまりにも多くの与えられた引数について同じエラーが残っています。

#include <iostream> 
template <typename...args_t, typename U, typename=void> 
static int valid (args_t...args, U u) { 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
    return u; 
} 

int main() { 
    return valid(0, 0.0, -1, 3u); 
} 
+0

これらはルールであるか、それともルールであるかを尋ねていますか? – ildjarn

+0

は 'gcc'でコンパイルしていないので、ルールであると考えています。なぜこれがそうであるかについて私が何かを見つけることができなかったので、私はそれの理由を聞いてうれしいです。もちろん、私はそれを迂回する方法も見たいと思います。(; – Jonas

+0

@Jonas他のコンパイラと同じように失敗します。 –

答えて

1

できないのはなぜgcc-5.4.0ない彼らは、関数の引数リストの最後に表示されない場合は、パラメータパックを推測?

あなたはそれらが向かって開いする必要があることそれは単にデフォルトのパラメータ値、またはプレーン省略記号(...)と同じ問題だと

void fails (args_...args, int last) 
         // ^^^^^^^^^^ 

のような可変引数パラメータパックを超えて任意の型を指定することはできませんのでパラメータリストの最後(つまり、最後の要素である必要があります):

void fails(int x = 0, int last); 
void fails(int x, ..., int last); 
関連する問題