c++ - 模板参数是模棱两可的/推断的参数冲突类型
问题描述
下面的程序会产生编译器错误:
- MSVC:错误 C2782:“双点(常量 V &,常量 V &)”:模板参数“V”不明确
- GCC:推断参数“const V”(“Matrix<3, 1>”和“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());
}
解决方案
不,那是行不通的。但实际上,您不需要模板
double dot(const Vector &, const Vector &) {...}
作品。您甚至不需要在UnitVector
. 子到基的转换是隐式完成的。
如果您想通常采用两种可隐式转换为通用类型的类型,则以下内容应该有效(未经测试)
template<class U>
double dot_impl(const U&, const U&) {...}
template<class U, class V>
auto dot(const U &u, const V &v) {
return dot_impl<std::common_type_t<U, V>>(u, v);
}
由于模板参数是显式的,因此在调用中完成了对这两个通用类型的隐式转换,因此一切正常。我将原件dot
移至dot_impl
,否则我们将dot
使用一个模板参数进行调用,这仍然可能是模棱两可的。
推荐阅读
- javascript - 使用 JavaScript 访问外部 json 文件
- r - 如何取消过滤或清除 r dplyr 中的过滤器?
- amazon-web-services - 使用 URL 远程启动(触发)EC2 amazon windows 服务器
- python - Pandas 关联一列到多列按列范围分组
- c++ - 在字符串开头附加字符会导致超出内存限制
- android - 根据屏幕尺寸实现布局
- python - 图片不显示
- python - 如何将这 20 种随机颜色分配给 Matplotlib 中的 20 对随机 x、y 对?
- go - 如何对字符串中的字节进行排序?
- windows - gnuplot 给出关于大小的错误,但包含约束