Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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

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_Compiler Errors_C++14 - Fatal编程技术网

C++ 模板参数的类型不明确/相互冲突

C++ 模板参数的类型不明确/相互冲突,c++,templates,compiler-errors,c++14,C++,Templates,Compiler Errors,C++14,下面的程序生成编译器错误: MSVC:错误C2782:“双点(常数V&,常数V&)”:模板参数“V”不明确 GCC:为参数“const V”(“矩阵”和“单位向量”)推导出冲突类型 我原以为它不会有这个问题,因为构造函数UnitVector(Vector)标记为explicit,因此(调用dot())的参数只能通过隐式转换解析为Vector。你能告诉我我在做什么吗?在解析模板参数时,编译器是否考虑显式< /代码>构造函数作为隐式转换? template<int M, int N>

下面的程序生成编译器错误:

  • MSVC:错误C2782:“双点(常数V&,常数V&)”:模板参数“V”不明确
  • GCC:为参数“const V”(“矩阵”和“单位向量”)推导出冲突类型
我原以为它不会有这个问题,因为构造函数
UnitVector(Vector)
标记为
explicit
,因此(调用
dot()
)的参数只能通过隐式转换解析为
Vector
。你能告诉我我在做什么吗?在解析模板参数时,编译器是否考虑<代码>显式< /代码>构造函数作为隐式转换?

template<int M, int N>
struct Matrix {
};

using Vector = Matrix<3,1>;

struct UnitVector : Vector{
    UnitVector(){}
    explicit UnitVector(const Vector& v)
    {}

    operator const Vector&(){
        return *static_cast<const Vector*>(this);
    }
};

template<typename V>
double dot(const V& a, const V& b){
    return 0.0;
}

int main()
{
    dot(Vector(),UnitVector());
}
模板
结构矩阵{
};
使用向量=矩阵;
结构单元向量:向量{
UnitVector(){}
显式单位向量(常量向量&v)
{}
运算符常量向量&(){
返回*static_cast(此);
}
};
模板
双点(常数V&a、常数V&b){
返回0.0;
}
int main()
{
点(向量(),单位向量());
}

不,那不行。但实际上,您不需要模板

双点(常数向量&,常数向量&){…}
工作。您甚至不需要在
UnitVector
中定义的转换运算符。子基转换是隐式完成的

如果您希望通常采用两种可隐式转换为公共类型的类型,那么以下方法应该可以(未测试)

模板
双点(常数U&,常数U&){…}
模板
自动点(常数U&U、常数V&V){
返回点_impl(u,v);
}

由于模板参数是显式的,所以在调用中对这两个参数的公共类型进行隐式转换,所以一切都很好。我将原来的
dot
移动到
dot\u impl
,因为否则我们将使用一个模板参数调用
dot
,这可能仍然是不明确的。

不,我担心编译器(语言)没有那么复杂:它需要从不同类型的对象推断出相同类型的
V
,所以你得到了一个模糊错误。我问题中的代码是从一个更大的程序中提取出来的,用来测试错误。这个模板还有很多其他的实例。但是关于从子到基的转换,你是对的,当然。@Museful我更新了我的答案,所以它应该提供你所需要的。