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我更新了我的答案,所以它应该提供你所需要的。