【问题标题】:which template type to use in MSVC/C++: size_t or int在 MSVC/C++ 中使用哪种模板类型:size_t 或 int
【发布时间】: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++


【解决方案1】:

您可能需要修改 Vec 并重试:

template <size_t Size>   // change to size_t from int to match the definition of Mat
using Vec = Mat<Size, 1>;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2018-04-11
    • 2010-11-02
    • 2019-05-02
    • 2022-01-11
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多