मेरा निम्नलिखित कार्य है:

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();
   }

Saya menyebutnya dengan:

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();
}

Tampaknya kompiler tidak dapat mencocokkan jenis template saat saya mendapatkan kesalahan ini:

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);
~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~

Saya cukup baru untuk C ++ / template. Jadi ini agak membingungkan. Saya telah mencari situasi yang sama tetapi ini adalah kasus penggunaan yang cukup mendasar dan saya bingung mengapa itu gagal.

Saya sudah menelepon fungsi dengan std :: string & dan eigen :: matriks f> f> f.

0
jkang 9 अक्टूबर 2020, 22:50

1 उत्तर

सबसे बढ़िया उत्तर

Coba ubah jenis template std::size ke int. Saya bisa mendapatkan yang berikut ini bekerja di 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 << ' ';
}

Itu tidak berfungsi dengan STD :: Ukuran untuk params K & F.

2
Alex Shirley 9 अक्टूबर 2020, 20:14