我的问题有点像模板类C ++中的部分规范。
我写了一个template<class T> class matrix
来进行一些矩阵计算。对于这个类,我定义了重载的比较运算符,例如==,&gt; =,&lt; =。我想要这段代码
matrix<float> a(2,3), b(2,3);
a.fill(1); b.fill(2);
matrix<bool> c = (a == b);
导致布尔矩阵c
具有相同大小的a
和b
以及c(i,j)<-true
iff a(i,j) == b(i,j)
。使用以下代码无法完成
template<class T>
class matrix
{
public:
matrix ();
matrix (size_t rows, size_t cols);
matrix (const matrix<T>& mx);
size_t rows() const;
size_t cols() const;
size_t size() const;
const T* ptr() const;
T* mutable_ptr();
// etc
private:
size_t num_rows;
size_t num_cols;
vector<T> data;
}
template<class T> const T* matrix<T>::ptr() const { return data.data(); }
template<class T> T* matrix<T>::mutable_ptr() { return data.data(); } // line **459**
template<class T> matrix<bool>& operator< (const matrix<T>& mx, const T t);
template<class T> matrix<bool>& operator<= (const matrix<T>& mx, const T t);
template<class T> matrix<bool>& operator> (const matrix<T>& mx, const T t);
template<class T> matrix<bool>& operator>= (const matrix<T>& mx, const T t);
template<class T> matrix<bool>& operator== (const matrix<T>& mx, const T t);
template<class T> matrix<bool>& operator!= (const matrix<T>& mx, const T t);
// ...
template<class T> matrix<bool>& operator== (const matrix<T>& mx, const T value) { // line **547**
matrix<bool> *index = new matrix<bool>(mx.rows(), mx.cols());
const T *ptr = mx.ptr();
bool *ptr_i = index->mutable_ptr();
size_t m = mx.size();
for (size_t i=0; i < m; ++i) {
if (ptr[i] == value)
ptr_i[i] = true;
else
ptr_i[i] = false;
}
return *index;
}
编译器输出
matrix.hpp: In member function ‘T* matrix<T>::mutable_ptr() [with T = bool]’:
matrix.hpp:547:35: instantiated from ‘matrix<bool>& operator==(const matrix<T>&, T) [with T = float]’
compute_sil.cpp:163:26: instantiated from here
matrix.hpp:459:66: error: void value not ignored as it ought to be
有没有办法克服这个问题?
修改 很抱歉没有足够的代码,我做了多个参数类型的运算符的重载,矩阵与标量之间以及矩阵之间。
template<class T> matrix<bool>& operator< (const matrix<T>& mx, const matrix<T>& mx2);
template<class T> matrix<bool>& operator<= (const matrix<T>& mx, const matrix<T>& mx2);
template<class T> matrix<bool>& operator> (const matrix<T>& mx, const matrix<T>& mx2);
template<class T> matrix<bool>& operator>= (const matrix<T>& mx, const matrix<T>& mx2);
template<class T> matrix<bool>& operator== (const matrix<T>& mx, const matrix<T>& mx2);
template<class T> matrix<bool>& operator!= (const matrix<T>& mx, const matrix<T>& mx2);
template<class T> matrix<bool>& operator< (const T t, const matrix<T>& mx);
template<class T> matrix<bool>& operator<= (const T t, const matrix<T>& mx);
template<class T> matrix<bool>& operator> (const T t, const matrix<T>& mx);
template<class T> matrix<bool>& operator>= (const T t, const matrix<T>& mx);
template<class T> matrix<bool>& operator== (const T t, const matrix<T>& mx);
template<class T> matrix<bool>& operator!= (const T t, const matrix<T>& mx);
答案 0 :(得分:0)
由@ user2079303评论,问题是由于我使用std::vector<bool>
,与模板c ++无关。 vector<bool>
未提供指向其数据的指针。我使用bool
更改为char
或int
,以便我的程序编译得很好。谢谢@ user2079303。