如何解决特征矩阵的“模板参数推导/替换失败”
我具有以下功能:
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,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,1>&)’
note: candidate: ‘template<class DATA_T,long unsigned int K,long unsigned int F> void write_raw_file(const string&,F>&)’
void write_raw_file(const std::string& filename,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
解决方法
尝试将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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。