c ++下标运算符到underling类向量

时间:2017-08-30 21:19:22

标签: c++ vector operator-overloading

所以我试图创建一个vec类,我可以在稍后进行数学运算。

在我开始实施实际程序之前一直很好。

Class vecn:

#include <vector>

template <typename T>
class vecn
{
public:
    vecn() {    }
    template <typename... Args>
    vecn(Args&&... args)
    {
        addtovector(args...);
    }

    friend std::ostream& operator<<(std::ostream& os, const vecn<T>& obj)
    {
        os << "{";
        for (auto it = obj.contents.begin(); it < obj.contents.end(); it++) {
            os << *it;
            if (it != obj.contents.end() -1)
            {
                os << ",";
            }
        }
        os << "}";
        return os;
    }

    template<typename T>
    vecn<T>& operator=(const vecn<T>& v) {
        contents = v.contents;
        return *this;
    }

    unsigned int size() const
    {
        return contents.size();
    }

    vecn<T> operator+(const vecn<T>& v1) {
        vecn<T> v2();
        for (unsigned int i = 0; i < size();i++)
        {
            v2[i] = v1[i] + this->contents[i];
        }
        return v2;
    }

    T& operator[](size_t Index)
    { 
        if (Index > contents.size() -1)
        {
            contents.resize(Index + 1);
        }
        return contents.at(Index);
    }

    const T& operator[](size_t Index) const
    {
        return contents.at(Index);
    }

private:
    template <typename... Args>
    void addtovector(T& first, Args&&... args)
    {
        addtovector(first);
        addtovector(args...);
    }

    void addtovector(T& item)
    {
        contents.push_back(item);
    }
    std::vector<T> contents;
};

现在我遇到了使用下标运算符来加入underling向量的问题,无论我如何设计它,它都不会有效。通常导致

Error   C2109   subscript requires array or pointer type

从谷歌搜索错误,我应该返回一个带有下标的数组的指针。我做的。

我有什么遗失的吗?

主:

vecn<int> v(1,2);
vecn<int> b(3, 4, 5);
std::cout << v + b;

预期产出:

{4,6,5}

3 个答案:

答案 0 :(得分:0)

海湾合作委员会告诉我确切的错误:

error: declaration of template parameter ‘T’ shadows template parameter

(适用于您的作业)

然后:

warning: pointer to a function used in arithmetic [-Wpointer-arith]
         v2[i] = v1[i] + this->contents[i];

(您已将v2声明为返回vecn<T>的函数,请删除括号

最后,修复您的operator+,因为它会尝试访问空v2向量的元素,并访问v1this->contents较小范围之外的范围他们的规模不相等。

在我看来,你为这么简单的事情写了很多不必要的代码。您不需要addtovector,只需展开参数包,如:

contents{std::forward<Args>(args)...}

在成员初始化列表中。您根本不需要定义operator=,而是将其留给编译器。并尝试implement operator+ in terms of operator+=

答案 1 :(得分:0)

尽管你有其他所有的东西,你的代码中还有一个令人毛骨悚然的东西

if (Index > contents.size() -1)

你永远不应该通过算术运算替换布尔运算符的正确选择! std :: vector&lt;&gt; .size()返回size_t(在大多数系统上都是unsigned long),只有你的selfmade size()返回int,因为负数大小没有意义,所以不应该这样做。

现在0 - 1不会产生负数,0表示size_t,但是huuuge:18446744073709551615(0xffffffffffffffff)。

所以尺寸()= 0

if (Index > contents.size() -1)

永远不会是真的,你的vec不会像你想要的那样在访问vec [0]时成长。只需使用

if (Index >= contents.size())

这正是你的意思。

答案 2 :(得分:0)

可能您的问题是您使用的是vecn<T> v2();而不是vecn<T> v2;,但您的解决方案中还有其他不好的事情。这是一些重构:

template <typename T>
class vecn {
public:
    vecn() {}
    template <typename... Args>
    vecn(Args&&... args)
    {
        addToVector(args...);
    }

    friend std::ostream& operator<<(std::ostream& os, const vecn<T>& obj)
    {
        os << "{";
        for (auto it = obj.contents.begin(); it < obj.contents.end(); it++) {
            os << *it;
            if (it != obj.contents.end() - 1)
                os << ",";
        }
        os << "}";
        return os;
    }

    // you don't need this
    // template<typename T>

    // also whole method is unnecessary
    //    vecn<T>& operator=(const vecn<T>& v)
    //    {
    //        contents = v.contents;
    //        return *this;
    //    }

    // use size_t
    /*unsigned int*/ size_t size() const
    {
        return contents.size();
    }

    vecn<T> operator+(const vecn<T>& other) const
    {
        vecn<T> result;
        size_t resultSize = std::max(other.size(), size());
        result.contents.reserve(resultSize);

        for (size_t i = 0; i < resultSize; ++i) {
            T value = {};
            if (i < other.size())
                value += other.contents[i];
            if (i < size())
                value += contents[i];

            result.contents.push_back(value);
        }

        return result;
    }

    T& operator[](size_t index)
    {
        return contents.at(index);
    }

    const T& operator[](size_t index) const
    {
        return contents.at(index);
    }

private:
    template <typename... Args>
    void addToVector(T& first, Args&&... args)
    {
        addToVector(first);
        addToVector(args...);
    }

    void addToVector(T& item)
    {
        contents.push_back(item);
    }
    std::vector<T> contents;
};