我有以下演示代码:
template <int i, typename T, typename U>
T func(const U &t){return i * t;}
template <int i, typename T>
T func(const T &t){return 2 * i * t;}
int main()
{
return func<1, int>(1);
}
这是我真实代码的简化版本,所以它似乎没用,但应该足以说明问题:
In function ‘int main()’:
11:23: error: call of overloaded ‘func(int)’ is ambiguous
11:23: note: candidates are:
2:3: note: T func(const U&) [with int i = 1, T = int, U = int]
5:3: note: T func(const T&) [with int i = 1, T = int]
所以很明显,自动类型推断(对于模板参数 U)干扰了我选择正确版本的模板函数(只有 2 个参数)的兴趣
我需要两个版本都有一个基本的和一个专门的模板,做的事情有点不同。
所以问题是:有没有可能告诉编译器此时不要自动推断类型(例如通过某种方式说:采用只有 2 个参数的模板)?