Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++编译器如何仅在某些提供时推断模板参数_C++_Templates_C++11_Type Inference - Fatal编程技术网

C++编译器如何仅在某些提供时推断模板参数

C++编译器如何仅在某些提供时推断模板参数,c++,templates,c++11,type-inference,C++,Templates,C++11,Type Inference,我有一个类模板: template<class Q, class V> bool EQ(const Q& q, V v) { return q.Eq(v); } 假设我这样使用它-只指定第一个模板参数 char *sz = "some string"; bool f = EQ<TEq01>(sz, '1'); 编译器如何知道TEq01是类Q而不是类V?我正在使用visual studio 2013。这是一个模板化函数。函数模板从传递的任何参数中获取

我有一个类模板:

template<class Q, class V>
bool EQ(const Q& q, V v) { 
    return q.Eq(v); 
}
假设我这样使用它-只指定第一个模板参数

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

编译器如何知道TEq01是类Q而不是类V?我正在使用visual studio 2013。

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

当您在箭头中指定类型时,编译器的顺序是1、2、3。任何未显式设置的类型都从函数参数中获取类型

我只是想知道编译器如何知道TEq01是类Q而不是类V?我正在使用visual studio 2013

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

模板参数的顺序将保持不变

既然你写了:

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

调用EQ意味着Q是TEq01,而V没有提供,因此必须进行推导。

问题是,当我只提供EQ时,编译器如何知道我的意思是EQ?它可以假设我的意思是EQ,但它不能?不,因为EQ函数先取Q,然后取V。它推断,既然sz是TEq01类型,那么它一定是,因为第二个参数是char类型,所以它一定是char类型。你是在问编译器是如何做到这一点的,可能太广泛了,还是语言规范对这种行为有什么规定?它是位置性的。第一个是第一个,第二个是第二个,依此类推。好的,这是有道理的。哇,我刚做了个实验。我可以调用EQ,EQ看起来可以通过这种方式指定模板参数的任何子集。你们不能想出更好的标识符吗?至少在这个例子中?哪些标识符?有很多!TEq01或EQ。常见的元语法名称是foo、bar或foobar。示例代码还包括许多冗余行,例如,那些定义成员(如Eq)的行与问题本身无关。好的,我会清理它。我把它从我真正的实时代码中去掉,删掉了一堆东西,但还不够,正如你所指出的那样。一秒钟…谢谢,这使问题更容易阅读。你可以添加,你可以将参数留空,因此EQ是一种提供V并将Q留待推导的方法。@Johnnycras我很确定这是图形形式错误的。我的语法可能不好!尽管如此@约翰尼克拉斯哪个编译器?如果它编译了,它要么是一个bug,要么是一个非标准扩展。
template<class Q, class V>
bool EQ...