当仅提供一些模板参数时,C++ 编译器如何推断模板参数

How does c++ compiler infer template parameters when only some provided

我有这个 class 模板:

template<class Q, class V>
bool EQ(const Q& q, V v) { 
    return q.Eq(v); 
}

和这个 class:

struct TEq01 { 
    char n1;                
    TEq01(const void* p) : n1(*(char*)p)     { }    
    bool Eq(char n) const                { return n1 == n; }
};

假设我这样使用它 - 只指定第一个模板参数

char *sz = "some string";
bool f = EQ<TEq01>(sz, '1');

编译器怎么知道TEq01是classQ而不是classV?我正在使用 visual studio 2013.

这是一个模板函数。函数模板从传递的任何内容中获取它们的参数类型。能够在箭头中指定类型是可选的,您不需要使用,除非您试图强制使用特定类型。

当您在箭头中指定类型时,编译器会按 1、2、3 的顺序进行操作。您未明确设置的任何类型都采用函数参数的类型。

I was just wondering how the compiler knows that TEq01 is class Q instead of class V? I'm using visual studio 2013.

您提供的第一个模板参数第一个模板参数

保持模板参数的顺序。

因为你写道:

template<class Q, class V>
bool EQ...

调用EQ<TEq01>意味着“QTEq01V没有提供,所以必须推导。”