【发布时间】:2020-08-16 19:00:55
【问题描述】:
MSVC 似乎对模板类型很敏感。我有一个模板函数
template<size_t size>
inline double squaredNormOfDiff(const Vec<size>& vec1, const Vec<size>& vec2){
double sum=0;
for(size_t i=0; i<size; i++) {
const double diff = vec1[i] - vec2[i];
sum += diff * diff;
}
return sum;
}
当我使用它时
Vec<3> a, b;
squaredNormOfDiff(a,b);
我收到一个错误
no instance of function template "raisim::squaredNormOfDiff" matches the argument list
但是我把模板改成
template<int size>
它突然起作用了。我一直在使用 size_t 作为 Linux 中的模板参数。在 Windows 中执行此操作的正确方法是什么?还是跨平台项目?
Vec 定义为
template <int Size>
using Vec = Mat<Size, 1>;
Mat 被定义为
template<size_t n, size_t m>
class Mat : public MatExpr<Mat<n, m>> {
union {
std::aligned_storage<n*m*sizeof(ScalarType), 32> alignment_only;
ScalarType v[n * m];
};
};
【问题讨论】:
-
Vec的定义是什么?请发minimal reproducible example 说明。 -
我更新了我的问题。这可能是由于 Vec 的模板类型造成的吗?
-
这仍然不是minimal reproducible example,它是一个独立的最小示例,无需任何修改即可编译(不缺少
#includes、main函数、无关代码等。 )。无论如何,我认为我之前在某个地方看到过 MSVC 有一个与此相关的错误... -
嗯,写下来,好像问题出在Vec的定义上。它在 Linux/GCC 中工作,但 MSVC 更敏感......
-
如果您的模板将
size_t值作为参数,那么您应该传递size_t值,而不仅仅是int。即使int可以隐式转换为size_t。通常使用int作为尺寸类型并不是一个好主意。
标签: c++ templates visual-c++