2
4

4 回答 4

3

你弄错了。默认参数不参与参数推导:

参数推导首先发生,作为选择所需重载的一部分,然后在必要时填充该重载的默认参数。

于 2012-09-23T18:18:49.310 回答
2

Kerrek SB 所说的是正确的,编译器只是没有足够的能力来推断 T2 (通过标准允许做的事情)。

在这种特殊情况下,您可以通过对所有内容仅使用一个模板参数来修复它,即

template< class T > T inc( const T v, const T u = 1 ) { return v + u; }
于 2012-09-23T18:59:32.240 回答
1

默认参数不参与演绎过程(仅用于重载解析,并且规则很难记住 - 始终保持简单)。

为了实现你想要的,你可以提供一个额外的重载:

template <class T1, class T2> T1 inc(T1 v, T2 u) { return v + u; }
template <class T> T inc(T v) { return v + T(1); }
于 2012-09-23T19:03:32.403 回答
0

C++ 中的模板函数是在编译时生成的,并且仅在需要时才生成。所以你可以得到一个生成的函数,如:

inc( int, int );

这将是 T1 = int 和 T2 = int 版本。如果您为每个模板参数传入参数,编译器可以隐式确定类型,因此:

int a = 1;
int b = 2;
inc( a, b );

编译器可以在编译时生成与上述类似的函数,因为它可以推断出 T1 = int 和 T2 = int。但是,如果你做你正在做的事情:

inc( 5 );

编译器可以确定 T1 = int,但无法确定 T2 是什么。因此不会生成任何函数,并且您会收到有关该函数不存在的错误。如果您使用一个模板参数,这可能是可以修复的:

template<class T> T inc(T v, T u = 1) { return v + u; }

或者,如果您提供重载:

template<class T> T inc(T v) { return v + 1; }

还有第三种方式:

inc<int, int>( 5 );

但我想这不是你想要的......

于 2012-09-24T22:18:42.843 回答