首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在模板C++中混合混凝土和非混凝土类型

在模板C++中混合混凝土和非混凝土类型
EN

Stack Overflow用户
提问于 2015-11-20 13:51:15
回答 1查看 452关注 0票数 0

我的问题有点像模板类C++中的部分规范。

我编写了一个template<class T> class matrix来进行矩阵计算。对于该类,我定义了重载比较操作符,如==、>=、<=。我要这段代码

代码语言:javascript
复制
matrix<float> a(2,3), b(2,3);
a.fill(1); b.fill(2);
matrix<bool> c = (a == b);

结果表明,布尔矩阵c的大小与ab相同,c(i,j)<-true当且仅当a(i,j) == b(i,j)。使用下面的代码无法完成此操作

代码语言:javascript
复制
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;
}

编译器输出

代码语言:javascript
复制
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

有什么办法可以克服这个问题吗?

编辑--抱歉,没有足够的代码,我在矩阵和标量之间,以及矩阵之间,使用了很多参数类型的操作符过载。

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2015-11-20 14:27:09

正如@user2079303所评论的,问题是由于我使用了std::vector<bool>,而不是模板c++。vector<bool>不提供指向其数据的指针。我从使用bool更改为charint,这样就可以很好地编译我的程序。谢谢@ Thank 2079303。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33828385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档