C++ 模板成员函数的调用

C++ 模板成员函数的调用,c++,templates,C++,Templates,如果我有课 class A { template<class T> void foo(T t); }; 或 a.foo(t) 在第二种变体中,X可能不是t的类型。例如,如果t是一个float,但您说a.foo(t),则不会推导出浮点变量,而是整数变量(如果不存在),并且会发生float-到-int的转换 如果类型相同,则没有区别。但是,在代码的整个生命周期中,人们永远不知道类型是否从未改变。在第二个变体中,X可能不是t的类型。例如,如果t是一个float,但您说a.f

如果我有课

class A {

  template<class T>
  void foo(T t);

};

a.foo(t)

在第二种变体中,
X
可能不是
t
的类型。例如,如果
t
是一个
float
,但您说
a.foo(t)
,则不会推导出浮点变量,而是整数变量(如果不存在),并且会发生
float
-到-
int
的转换


如果类型相同,则没有区别。但是,在代码的整个生命周期中,人们永远不知道类型是否从未改变。

在第二个变体中,
X
可能不是
t
的类型。例如,如果
t
是一个
float
,但您说
a.foo(t)
,则不会推导出浮点变量,而是整数变量(如果不存在),并且会发生
float
-到-
int
的转换

如果类型相同,则没有区别。然而,在代码的整个生命周期中,人们永远不知道类型是否从未改变。

a.foo(t)
基本上将
t
推导出
t
的类型。如果这对你没问题,就用这个

a.foo
将强制
T
X
,表达式的正确性现在取决于
T
是否可转换为
X
。有时,如果希望将
t
转换为
X
,您希望这样做,但您可以将其编写为
a.foo(X{t})
。第二种形式并不完全相同,因为它也允许显式转换。

a.foo(t)
基本上将
t
推导出
t
的类型。如果这对你没问题,就用这个

a.foo
将强制
T
X
,表达式的正确性现在取决于
T
是否可转换为
X
。有时,如果希望将
t
转换为
X
,您希望这样做,但您可以将其编写为
a.foo(X{t})
。第二种形式并不完全等效,因为它还允许显式转换

a.foo(t)
a.foo<X>(t)