再帰呼び出しの最後でテンプレート引数なしの関数が呼ばれるため、5行目でダミーの関数を定義しているのですが、
コンパイルすると「適合する関数がありません」というエラーが出てしまいます。
どこが問題なのでしょうか?
追記:
Ubuntu + gcc 4.6.3
及び Ideone.com (http://ideone.com/6gzy5) で確認しました
#include <iostream>
#include <tuple>
// テンプレート引数が無いときのダミー関数
std::tuple<> GetDeserializedValue(const std::string& data) {return std::tuple<>();}
// 変数を一つずつ復元する関数
template<class First, class... Rest>
std::tuple<First, Rest...> GetDeserializedValue(const std::string& data)
{
std::string buffer(data);
const First& value = *reinterpret_cast<const First*>(buffer.data());
buffer.erase(sizeof(First));
// 後続するテンプレート引数を使って再帰呼び出しをして、結果のタプルを連結する
return std::tuple_cat(std::tuple<First>(value), GetDeserializedValue<Rest...>(buffer));
}
// バッファから変数を復元し、タプルで返す関数
template<class... Types>
std::tuple<Types...> Deserialize(const std::string& data)
{
return GetDeserializedValue<Types...>(data);
}
int main() {
Deserialize<int, double>("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
return 0;
}
prog.cpp: In function 'std::tuple<_Head, _Tail ...> GetDeserializedValue(const std::string&) [with First = double, Rest = {}, std::string = std::basic_string<char>]':
prog.cpp:16:90: instantiated from 'std::tuple<_Head, _Tail ...> GetDeserializedValue(const std::string&) [with First = int, Rest = {double}, std::string = std::basic_string<char>]'
prog.cpp:23:47: instantiated from 'std::tuple<_Elements ...> Deserialize(const std::string&) [with Types = {int, double}, std::string = std::basic_string<char>]'
prog.cpp:27:66: instantiated from here
prog.cpp:16:90: error: no matching function for call to 'GetDeserializedValue(std::string&)'