C++ 调用模板函数的常规方法 结构A { 样板 空f(U) { } }; 样板 空隙f(T) { A A; a、 模板f(t); a、 模板f(t); a、 f(t); a、 f(t); a、 f(t); }

C++ 调用模板函数的常规方法 结构A { 样板 空f(U) { } }; 样板 空隙f(T) { A A; a、 模板f(t); a、 模板f(t); a、 f(t); a、 f(t); a、 f(t); },c++,templates,C++,Templates,至少在MSVC2010下,上述代码编译良好 在所有呼叫A.f的方式中,有没有什么优先的方法 有什么不同吗?最后一个似乎最容易写 否则就没有区别了,除非你必须消除几个f之间的歧义 最后一个似乎最容易写 否则就没有区别了,除非你必须消除几个f之间的歧义 那么,a有类型a,在这种上下文中它不是依赖类型。因此,模板关键字是不需要的,它只用于混淆代码——不要使用它 调用模板而不提供任何参数的版本同样不会改变行为,只会降低代码的可读性——也不要使用它 在剩下的两个候选者之间,a.f(t)和a.f(t),在大

至少在MSVC2010下,上述代码编译良好

在所有呼叫A.f的方式中,有没有什么优先的方法


有什么不同吗?

最后一个似乎最容易写


否则就没有区别了,除非你必须消除几个f之间的歧义

最后一个似乎最容易写


否则就没有区别了,除非你必须消除几个f之间的歧义

那么,
a
有类型
a
,在这种上下文中它不是依赖类型。因此,
模板
关键字是不需要的,它只用于混淆代码——不要使用它

调用模板而不提供任何参数的版本同样不会改变行为,只会降低代码的可读性——也不要使用它


在剩下的两个候选者之间,
a.f(t)
a.f(t)
,在大多数情况下使用第一个,如果编译器无法推断类型,则使用第二个。

那么,
a
具有类型
a
,在这种上下文中它不是依赖类型。因此,
模板
关键字是不需要的,它只用于混淆代码——不要使用它

调用模板而不提供任何参数的版本同样不会改变行为,只会降低代码的可读性——也不要使用它


在剩下的两个候选项,
a.f(t)
a.f(t)
之间,在大多数情况下使用第一个,如果编译器无法推断类型,则使用第二个。

没有任何差异。如果您没有任何理由向函数提供类型信息,那么最后一个是最好的。但您可能希望函数将参数当作指定类型来处理,只有在需要时才这样做。比如说

struct A
{
    template <class U> 
    void f(U)
    {

    }
};

template <class T>
void f(T t) 
{
    A a;
    a.template f<int>(t);
    a.template f<>(t);
    a.f<int>(t);
    a.f<>(t);
    a.f(t);
}
如果调用Divide(5,2),则得到2。只有在这种情况下,才应指定类型:

T Divide(T a, T b)
{
    return a/b;
}
Divide(5,2);

它返回2.5。

完全没有差异。如果您没有任何理由向函数提供类型信息,那么最后一个是最好的。但您可能希望函数将参数当作指定类型来处理,只有在需要时才这样做。比如说

struct A
{
    template <class U> 
    void f(U)
    {

    }
};

template <class T>
void f(T t) 
{
    A a;
    a.template f<int>(t);
    a.template f<>(t);
    a.f<int>(t);
    a.f<>(t);
    a.f(t);
}
如果调用Divide(5,2),则得到2。只有在这种情况下,才应指定类型:

T Divide(T a, T b)
{
    return a/b;
}
Divide(5,2);
它返回2.5。

如果我改为A,则第一个调用将变得更可取?@Guillaume07:不可取,但必要(如果显式提供了模板参数)。否则编译器将解析
a.fIf,如果我有一个a,则第一个调用将变得更可取?@Guillaume07:不可取,但必要(如果显式提供了模板参数)。否则编译器将解析
a.f