【发布时间】:2013-10-14 17:13:18
【问题描述】:
我认为以下代码应该可以工作,但 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 函数被认为是等效的事实。虽然我认为第二个比第三个更合适(就像第一个一样)。
我不确定。谁能告诉我是我错了还是编译器错了?
【问题讨论】:
-
第二个重载意味着什么?它是与第三个重载完全一样,除了只针对最后一个元素...
-
第二个重载只能匹配元组的last元素,第三个匹配元组的任意元素。
标签: c++ templates c++11 overloading overload-resolution