即使在琐碎代码的上下文中,函数模板上的显式模板参数也一次又一次地让我感到惊讶。这样的代码应该被视为反模式吗?一些开发人员在其他 StackOverflow 线程中假设了这一点。
在以下代码中,编译器在代码位置 (1) 处报告错误,指出未找到合适的函数重载。如果编译器检测到歧义,我不会那么惊讶,但事实并非如此。有什么提示吗?我正在使用 gcc 4.6.2
编辑:我不是在寻找解决方案。cppreference 中记录了一个示例解决方案。我正在寻找解释。
#include <iostream>
#include <tuple>
#include <type_traits>
using namespace std;
template<typename T, size_t N = 1>
//typename enable_if<integral_constant<bool, N==1>::value, ostream>::type &
ostream & operator << (ostream& stream, tuple<T> const & t)
{
return stream << get<0>(t) << endl;
}
template<typename ...T, size_t N = sizeof...(T)>
//typename enable_if<integral_constant<bool, N!=1>::value, ostream>::type &
ostream & operator << (ostream& stream, tuple<T...> const & t)
{
operator << <T...,N-1> (stream, t); // (1) compile error
return stream << get<N-1>(t) << endl;
}
int main ()
{
auto t = make_tuple ("hallo", 1L, 1.1);
cout << t << endl;
}