模板化线性代数向量类中的奇怪“成员函数不可行”错误

西蒙·艾兹曼

我正在实现模板化的矢量类(不是数据容器,而是线性代数意义上的矢量),每当我rhs在运算符重载中引用时,都会遇到很多错误另外,我的复制构造函数似乎不起作用。

#ifndef __VecXd__VecXd__
#define __VecXd__VecXd__

#define ULL unsigned long long
#include <iostream>

using namespace std;

template <class T>
class VecXd
{

public:

    explicit VecXd(ULL newDimension = 1) { dimension = newDimension; vector = new T[newDimension];}
    VecXd(const VecXd<T> &rhs);
    VecXd<T>& operator=(const VecXd<T> &rhs);
    const VecXd<T> operator+(const VecXd<T> &rhs) const;
    VecXd<T>& operator+=(const VecXd<T> &rhs);
    friend ostream& operator<<(ostream &out, VecXd<T> vec);
    friend istream& operator>>(istream &in, VecXd<T>& vec);
    ~VecXd() { delete[] vector; }

    const ULL getDimension() { return dimension; }
    const T itemAtIndex(ULL index) { if(index >= dimension) throw 1; return vector[index]; }

private:

    ULL dimension;
    T *vector;

};

template <class T>
VecXd<T>::VecXd(const VecXd<T> &rhs)
{
    dimension = rhs.getDimension();
    vector = new T[dimension];
    for (ULL i = 0; i < dimension; ++i)
        vector[i] = rhs.itemAtIndex(i);
}

template <class T>
VecXd<T>& VecXd<T>::operator=(const VecXd<T> &rhs)
{
    if (this != &rhs)
    {
        if (dimension != rhs.getDimension())
        {
            delete [] vector;
            dimension = rhs.getDimension();
            vector = new T[dimension];
        }
        for (ULL i = 0; i < dimension; ++i)
            vector[i] = rhs.itemAtIndex(i);
    }
    return *this;
}

template <class T>
VecXd<T>& VecXd<T>::operator+=(const VecXd<T> &rhs)
{
    if (dimension != rhs.getDimension())
    {
        cout << "\nCannot perform addition. Vectors do not have the same dimensions.\n";
        throw 1;
    }
    else
    {
        for (ULL i = 0; i < dimension; ++i)
            vector[i] += rhs[i];
    }
    return *this;
}

template <class T>
const VecXd<T> VecXd<T>::operator+(const VecXd<T> &rhs) const
{
    VecXd<T> temp = *this;
    temp += rhs;
    return temp;
}

template <class T>
ostream& operator<<(ostream &outs, VecXd<T> vec)
{
    for (ULL i = 0; i < vec.dimension; ++i)
        out << vec.vector[i] << (i+1 < vec.dimension ? " " : "");
    return out;
}

template <class T>
istream& operator>>(istream &in, VecXd<T> &vec)
{
    ULL newDim = 1;
    cin >> newDim;
    if (!cin.good())
    {
        cout << "\nImproper input.\n";
        throw 1;
    }
    else
    {
        delete [] vec.vector;
        vec.dimension = newDim;
        vec.vector = new T[vec.dimension];
        for (ULL i = 0; i < vec.dimension; ++i)
            in >> vec.vector[i];
    }
    return in;
}

#endif /* defined(__VecXd__VecXd__) */

我收到这种样式的错误:

Member function 'getDimension' not viable: 'this' argument has type 'const VecXd<int>', but function is not marked const

每次rhs调用函数(例如getDimension()itemAtIndex()时都会发生这种情况出现两个错误(一次为VecXd<int>,另一个为VecXd<int>)。

另外,此行的重载+ operator函数中无法识别复制构造函数:

VecXd<T> temp = *this;

帮助?

约瑟夫·曼斯菲尔德

为了能够在const对象上调用函数,您需要向编译器保证该函数不会修改该对象。为此,您可以在函数的const参数列表之后用关键字标记该函数例如,为了使getDimension一个const成员函数,你将其更改为:

const ULL getDimension() const { return dimension; }

(请注意,const返回类型中的in绝对无效,因此您应该摆脱它)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

聚合类和不可行的构造函数模板

来自分类Dev

C ++:混淆可变参数模板,导致“候选函数不可行”错误

来自分类Dev

numpy中的线性代数

来自分类Dev

Cplex 错误:添加微不足道的不可行线性约束

来自分类Dev

C ++候选函数不可行?

来自分类Dev

JUCE-成员函数不可行:“此”参数的类型为const

来自分类Dev

Julia中的线性代数运算顺序

来自分类Dev

clang错误:注意:候选构造函数(隐式move构造函数)不可行:

来自分类Dev

当向量化不可行时,有什么方法可以遍历数据帧中的行?

来自分类Dev

共轭梯度中使用的Scipy线性代数LinearOperator函数

来自分类Dev

模板类中的模板成员函数专门化

来自分类Dev

C++ 默认复制构造函数不可行

来自分类Dev

为什么我得到“候选构造函数不可行”?

来自分类Dev

导入线性代数块

来自分类Dev

在张量流中实现简单的线性代数运算

来自分类Dev

Python中复杂稀疏线性代数的限制

来自分类Dev

你如何专门化模板类中的成员函数?

来自分类Dev

我的模板类中的C ++成员函数未声明错误

来自分类Dev

模板类与向量中的 std::array 成员

来自分类Dev

从右值引用到基的构造函数-可行(gcc)或不可行(clang)-谁是对的

来自分类Dev

Gurobi:显然可行的模型会引发不可行的模型错误?

来自分类Dev

推导类模板中的模板成员函数

来自分类Dev

模板类-成员函数专门化

来自分类Dev

模板类成员函数实例化

来自分类Dev

模板类成员函数的专业化

来自分类Dev

C ++:没有用于初始化的匹配构造函数/候选构造函数不可行:需要单个参数,但未提供任何参数

来自分类Dev

开始学习线性代数的最佳地点?

来自分类Dev

微风线性代数概率分布

来自分类Dev

需要重塑以避免不可行

Related 相关文章

  1. 1

    聚合类和不可行的构造函数模板

  2. 2

    C ++:混淆可变参数模板,导致“候选函数不可行”错误

  3. 3

    numpy中的线性代数

  4. 4

    Cplex 错误:添加微不足道的不可行线性约束

  5. 5

    C ++候选函数不可行?

  6. 6

    JUCE-成员函数不可行:“此”参数的类型为const

  7. 7

    Julia中的线性代数运算顺序

  8. 8

    clang错误:注意:候选构造函数(隐式move构造函数)不可行:

  9. 9

    当向量化不可行时,有什么方法可以遍历数据帧中的行?

  10. 10

    共轭梯度中使用的Scipy线性代数LinearOperator函数

  11. 11

    模板类中的模板成员函数专门化

  12. 12

    C++ 默认复制构造函数不可行

  13. 13

    为什么我得到“候选构造函数不可行”?

  14. 14

    导入线性代数块

  15. 15

    在张量流中实现简单的线性代数运算

  16. 16

    Python中复杂稀疏线性代数的限制

  17. 17

    你如何专门化模板类中的成员函数?

  18. 18

    我的模板类中的C ++成员函数未声明错误

  19. 19

    模板类与向量中的 std::array 成员

  20. 20

    从右值引用到基的构造函数-可行(gcc)或不可行(clang)-谁是对的

  21. 21

    Gurobi:显然可行的模型会引发不可行的模型错误?

  22. 22

    推导类模板中的模板成员函数

  23. 23

    模板类-成员函数专门化

  24. 24

    模板类成员函数实例化

  25. 25

    模板类成员函数的专业化

  26. 26

    C ++:没有用于初始化的匹配构造函数/候选构造函数不可行:需要单个参数,但未提供任何参数

  27. 27

    开始学习线性代数的最佳地点?

  28. 28

    微风线性代数概率分布

  29. 29

    需要重塑以避免不可行

热门标签

归档