【发布时间】:2012-11-22 04:30:56
【问题描述】:
我写了一个简单的模板矩阵类,getMat函数应该返回一个原始大小不同的子矩阵,所以我这样编码:
template <typename T, size_t m, size_t n, typename _Prd>
template<size_t _m, size_t _n>
Matrix<T,_m,_n,_Prd> Matrix<T,m,n,_Prd>::getMat(const size_t& ulrow, const size_t& ulcol ) const
{
assert(_m+ulcol <= m && _n+ulrow <= n) ;
T temp[_m*_n] ;
for (size_t j = 0 ; j < _m ; ++j)
for (size_t i = 0 ; i < _n ; ++i)
temp[j*_n+i] = data[(ulrow + j) * n + ulcol+i] ;
return Matrix<T,_m,_n,_Prd>(temp) ;
}
那我这样称呼它:
Matrix<double, 4,4> testmat2(100.0) ;
Matrix<double,2,2> testmat4 = testmat2.getMat(0,0) ;
它显示如下错误:
main.cpp:127: error: no matching function for call to ‘Matrix<double, 4ul, 4ul, std::equal_to<double> >::getMat(size_t, size_t)’
所以我的问题是为什么编译器没有检测到这个 getMat 函数?
更新:
我以这种方式尝试了代码,它可以工作:
template <typename T, size_t m, size_t n, typename _Prd>
template<size_t _m, size_t _n>
void Matrix<T,m,n,_Prd>::getMat(Matrix<T,_m,_n,_Prd>& result, const size_t& ulrow, const size_t& ulcol) const
{
assert(_m+ulcol <= m && _n+ulrow <= n) ;
for (size_t j = 0 ; j < _m ; ++j)
for (size_t i = 0 ; i < _n ; ++i)
result[j*_n+i] = data[(ulrow + j) * n + ulcol+i] ;
}
这是传递要修改的子矩阵作为参考。
所以我的问题是,当这个函数返回不同的模板类型(相同的对象)时,编译器根本没有检测到这个函数。
但我之前在许多转换运算符上使用过这种技术,它们都有效。 例如,这个有效:
template<typename T, int cn, typename _Prd>
template<typename U, typename _Prd2>
Vec<T,cn,_Prd>::operator Vec<U,cn,_Prd2>() const
{
U temp[cn] ;
for (int i = 0 ; i < cn ; ++i)
temp[i] = static_cast<U>(this->data[i]) ;
Vec<U,cn,_Prd2> v(temp) ;
return v ;
};
更新2:
我根据iammilind修改了代码:
template<size_t _m, size_t _n>
Matrix<T,_m,_n,_Prd> getMat<_m,_n>(const size_t& ulrow, const size_t& ulcol) const ;
// the declaration in the class.
template <typename T, size_t m, size_t n, typename _Prd>
template<size_t _m, size_t _n>
Matrix<T,_m,_n,_Prd> Matrix<T,m,n,_Prd>::getMat<_m,_n>(const size_t& ulrow, const size_t& ulcol ) const
{
assert(_m+ulcol <= m && _n+ulrow <= n) ;
T temp[_m*_n] ;
for (size_t j = 0 ; j < _m ; ++j)
for (size_t i = 0 ; i < _n ; ++i)
temp[j*_n+i] = data[(ulrow + j) * n + ulcol+i] ;
return Matrix<T,_m,_n,_Prd>(temp) ;
}
我称之为:
Matrix<double,2,2> testmat7 = testmat2.getMat<2,2>(0,0) ;
但它不能编译:
In file included from main.cpp:13:
Matrix.hpp:125: error: expected initializer before ‘<’ token
In file included from main.cpp:13:
Matrix.hpp:268: error: expected initializer before ‘<’ token
main.cpp: In function ‘int main(int, char**)’:
main.cpp:135: error: ‘class Matrix<double, 4ul, 4ul, std::equal_to<double> >’ has no member named ‘getMat’
main.cpp:135: error: expected unqualified-id before numeric constant
谢谢。
【问题讨论】:
-
getMat()也是一个template函数,因此您必须将其称为testmat2.getMat<_m,_n>(0,0)其中_m,_n是您的选择。但是您的代码非常混乱。 -
@iammilind,我认为你是对的。我能问一下为什么会让人困惑吗?
-
@iammilind,我觉得不是模板函数的问题,我按照你的建议修改了,但是编译不出来,能否请你提供更多信息?
-
@tomriddle_1234,您可以在代码中粘贴您如何调用
getMat<>的问题。它仍然显示旧方式。 -
@iammilind,它就在那里。非常感谢