1

次のテストケースがコンパイルに失敗することを説明する基本的な理由は何ですか?

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>

template<typename Type, typename... Args> 
void apply(std::vector<Type> &v, Args... args, void(*algo)(Type*, Type*, Args...))
{
    algo(&*v.begin(), &*v.end(), args...);
}

int main()
{
    std::vector<int> v(10, 50);
    apply(v, 3, std::iota);
    for (unsigned int i = 0; i < v.size(); ++i) {
       std::cout<<v[i]<<std::endl;
    }
}

関数プロトタイプの回避策はありますか?

4

1 に答える 1

2

最初の問題は、コンパイラエラーが示すように、次のとおりです。

パラメータパックは、パラメータリストの最後にある必要があります。

つまり、関数を宣言する必要があるためArgs ... args、リストの最後の引数になります。

また、コンパイラがテンプレートテンプレートを使用するテンプレート関数のタイプを使用方法で推測するとは思わないため、テンプレートを明示的に指定する必要があります。

apply<int, int>(v, std::iota, 3); // or something

提案された修正であなたのスニップのイデオネ

于 2012-11-06T22:26:11.493 に答える