2012-02-24 49 views
2

我使用的是Armadillo lib for linear algebra,我是新来的C++。返回一个模板并且没有匹配的调用函数

需要序列化std :: String中的某些矩阵(用于保存在一些xml中)并且有一些ready method that take a stream

由于我不习惯阅读完整的streamtring操作(我是一个python程序员)的C++代码,我决定使用一些方法来处理字符串并隐藏流的东西以提高我的代码可读性。

用于做出改良效果在我的C++知识,我决定尝试使用模板为使所有犰狳类的一种方法:()他们都.load(和.save())垫,rowvec,colvec

我决定把这些方法写在一个单独的文件utils.h中,它在未来的项目中也应该是有用的!

的问题是第二种方法:

using namespace std; 

// 1° 
template<typename Matrix> 
string matrix_to_string(Matrix& m) { 
    stringstream ss; 
    m.save(ss, arma::arma_ascii); 
    return ss.str(); 
} 

// 2° 
template<typename Matrix> 
Matrix matrix_from_string(string& s) { 
    stringstream ss; 
    ss << s; 
    Matrix m; 
    m.load(ss, arma::arma_ascii); 
    return m; 
} 

第一种方法的作品完美,但第二个..如果我尝试使用它我得到的错误:

no matching function for call to ‘matrix_from_string(std::string&)’ 

我这样称呼它:

mat prior; 
string s = XML.getValue("prior", ""); // my XML lib, it works fine 
prior = matrix_from_string(s); 

发生了什么事?

+1

你怎么叫它? – m0skit0 2012-02-24 10:52:46

+1

您可能在未明确提供类型的情况下调用该函数。类型不能从返回类型推断出来(它可以从参数中推断出来,这可能是你的第一个函数起作用的原因)。您应该将调用发布到代码进行确认。 – 2012-02-24 10:53:26

+0

好了!对不起, – nkint 2012-02-24 10:56:18

回答

3

更改线路

prior = matrix_from_string(s); 

prior = matrix_from_string<mat>(s); 
+0

它的工作原理,谢谢 – nkint 2012-02-24 10:57:42