【问题标题】:"template argument deduction/substitution failed" for Eigen Matrix特征矩阵的“模板参数推导/替换失败”
【发布时间】:2021-01-24 21:53:31
【问题描述】:

我有以下功能:

template <typename DATA_T, std::size_t K, std::size_t F>                                                                                                                                                      
   void write_raw_file(const std::string& filename, Eigen::Matrix<DATA_T, K, F>& data) {                                                                                                                         
      std::fstream out_file = std::fstream(filename, std::ios::out | std::ios::binary);                                                                                                                          

      for(std::size_t i = 0; i < data.rows(); i++) {
         for(std::size_t j = 0; j < data.cols(); j++) { 
            out_file.write((char*) &data(i,j), sizeof(DATA_T));                                                                                                                                                                                                                                                                                                                               
         }
      }

      out_file.close();
   }

我是这样称呼它的:

template <typename DATA_T, typename K>
class my_class {
  void my_func() {
    std::string filename = "my_file.raw";
    Eigen::Matrix<DATA_T, K, static_cast<std::size_t>(1)> my_mat;
    write_raw_file(filename, my_mat);
  }
};

int main() {
  my_class<float, 16> obj();
  obj.my_func();
}

当我收到此错误时,编译器似乎无法匹配模板类型:

error: no matching function for call to ‘write_raw_file(std::string&, Eigen::Matrix<float, 128, 1, 0, 128, 1>&)’
note: candidate: ‘template<class DATA_T, long unsigned int K, long unsigned int F> void write_raw_file(const string&, Eigen::Matrix<DATA_T, K, F>&)’
void write_raw_file(const std::string& filename, Eigen::Matrix<DATA_T, K, F>& data) {
note:   template argument deduction/substitution failed:
note:   mismatched types ‘long unsigned int’ and ‘int’
write_raw_file(filename, my_mat);
~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~

我对 C++/模板还很陌生。所以这有点令人困惑。我已经搜索过类似的情况,但这是一个非常基本的用例,我不知道它为什么会失败。

我用 std::string& 和 Eigen::Matrix& 类型调用了函数。

【问题讨论】:

  • K是如何定义的?
  • 已澄清。我调用的函数在一个模板类中,以 DATA_T 和 K 作为模板参数。
  • 你是如何实例化 my_class 的?

标签: c++ c++11 templates


【解决方案1】:

尝试将std::size 的模板类型更改为int。 我能够在 Godbolt 上完成以下工作:

#include <iostream>
#include <vector>
#include <Eigen/Dense>

template <typename DATA_T, int K, int F>                                                                                                                                                      
std::vector<float> write_raw_file(Eigen::Matrix<DATA_T, K, F>& data) {                                                                                                                         
    auto vec = std::vector<float> {};
    for(auto i = 0; i < data.rows(); i++) {
        for(auto j = 0; j < data.cols(); j++) { 
        vec.push_back(data(i,j));                                                                                                                                                                                                                                                                                                                            
        }
    }
    return vec;
}

int main(){
    Eigen::Matrix3f m;
    m << 1.0, 2.0, 3.0,
        4.0, 5.0, 6.0,
        7.0, 8.0, 9.0;
    auto res = write_raw_file(m);
    for (auto item : res)
        std::cout << item << ' ';
}

它不适用于参数 K 和 F 的 std::size。

【讨论】:

  • 这很有趣。所以 std::size_t (我相信我的系统上的无符号长)不能用作模板非类型?
  • 不适用于 Eigen::Matrix。根据eigen.tuxfamily.org/dox/group__TutorialMatrixClass.html,标准模板是Int,因此任何使用矩阵的函数都将携带它们。在模板实例化期间,您不能不匹配类型,编译器会更加严格,同时给出无用的错误。
  • @jkang,既然你已经在做模板,也许可以看看使用 ostreams 作为函数的输入,然后当你重用这个函数时,你可以将 ostream 传递给任一文件或终端。
猜你喜欢
  • 2018-04-28
  • 2014-09-22
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多