我认为以下代码应该可以工作,但是 g++ 和 clang++ 都返回完全相同的错误(尽管 Visual C++ 2012 没有)。
#include <iostream>
#include <tuple>
template <int N, typename T>
struct A { };
template <typename Tuple>
double result(const Tuple& t, const A<0, typename std::tuple_element<0, Tuple>::type>& a)
{
return 0;
}
template <typename Tuple>
double result(const Tuple& t, const A<std::tuple_size<Tuple>::value-1,
typename std::tuple_element<std::tuple_size<Tuple>::value-1,Tuple>::type>& a)
{
return 1;
}
template <typename Tuple, int N>
double result(const Tuple& t, const A<N, typename std::tuple_element<N, Tuple>::type>& a)
{
return 0.5;
}
int main()
{
auto a = std::make_tuple(0, 1, 2., 3., 4);
std::cout << result(a, A<0,int>()) << std::endl;
std::cout << result(a, A<2,double>()) << std::endl;
std::cout << result(a, A<4,int>()) << std::endl; // Fails if uncommented
return 0;
}
错误是由于最后一行以及第二个和第三个result
函数被认为是等效的事实。虽然我认为第二个比第三个更合适(就像第一个一样)。
不过我不确定。谁能告诉我我错了还是编译器错了?