【发布时间】:2020-05-11 19:26:36
【问题描述】:
下面的程序会产生编译错误:
- MSVC:错误 C2782:“双点(const V &,const V &)”:模板参数“V”不明确
- GCC:推断出参数“const V”(“Matrix”和“UnitVector”)的冲突类型
我原以为不会有这个问题,因为构造函数UnitVector(Vector) 被标记为explicit,因此(对dot() 的调用)的参数只能通过隐式转换解析为Vector。你能告诉我我误解了什么吗?解析模板参数时,编译器是否将explicit构造函数视为隐式转换?
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());
}
【问题讨论】:
-
不,我担心编译器(语言)没有那么复杂:它需要从不同类型的对象中推导出相同类型的
V,所以会出现歧义错误。跨度>
标签: c++ templates compiler-errors c++14