9

Code::Blocks で単純な可変個引数テンプレート テストを用意しましたが、エラーが発生します。

「OutputSizes()」の呼び出しに一致する関数がありません

ここに私のソースコードがあります:

#include <iostream>
#include <typeinfo>

using namespace std;

template <typename FirstDatatype, typename... DatatypeList>
void OutputSizes()
{
    std::cout << typeid(FirstDatatype).name() << ": " << sizeof(FirstDatatype) << std::endl;
    OutputSizes<DatatypeList...>();
}

int main()
{
    OutputSizes<char, int, long int>();
    return 0;
}

でGNU GCCを使用してい-std=C++0xます。使用し-std=gnu++0xても違いはありません。

4

2 に答える 2

15

基本ケースを明確にする方法は次のとおりです。

#include <iostream>
#include <typeinfo>

template <typename FirstDatatype>
void OutputSizes()
{
    std::cout << typeid(FirstDatatype).name() << ": " << sizeof(FirstDatatype) << std::endl;
}

template <typename FirstDatatype, typename SecondDatatype, typename... DatatypeList>
void OutputSizes()
{
    OutputSizes<FirstDatatype>()
    OutputSizes<SecondDatatype, DatatypeList...>();
}

int main()
{
    OutputSizes<char, int, long int>();
}
于 2011-02-17T23:22:15.783 に答える
1

それは、ベースケースを提供していないためです。可変個引数テンプレート パラメーターの最後のデータ型を抽出しました。次に、空の可変個引数を、型と可変個引数を受け取る関数に一致させようとしました。可変引数パラメーターが空の場合の「基本ケース」を提供する必要があります。

using namespace std;

template <typename FirstDatatype, typename... DatatypeList>
void OutputSizes()
{
    std::cout << typeid(FirstDatatype).name() << ": " << sizeof(FirstDatatype) << std::endl;
    OutputSizes<DatatypeList...>();
}

template<typename... DataTypeList>
void OutputSizes() // We're called when there's no template arguments
                   // left in the pack
{
}

int main()
{
    OutputSizes<char, int, long int>();
    return 0;
}

編集:ここで示した多数のゼロのオーバーロードは、テンプレートの種類に基づいて実際の実行時引数を取得した場合にのみ機能します。テンプレート パラメーターのみを直接受け取る場合は、Howard Hinnant の回答に示されているように、2 対 1 の再帰を使用します。

于 2011-02-17T23:14:41.200 に答える