C ++ - 无法使用运算符重载

时间:2015-07-12 12:58:12

标签: c++ templates comparison const operator-keyword

我是Stack Overflow和C ++的新手!所以这就是问题所在:

目标是使用下一个界面创建容器类:

IContainer.h:

class ElemNotFound {};

template < class ElemType, class IndexType > class IContainer
{
public:
    virtual const ElemType& GetElem(const IndexType& index) const throw (ElemNotFound) = 0;
    virtual void PutElem(const IndexType& index, const ElemType& elem) throw () = 0;
};

使用该界面的当前代码是:

    #include "IContainer.h"
    #include <vector>

    class Container : public IContainer < class ElemType, class IndexType >
    {

    private:

        struct ContainerElement
        {
            IndexType& Index;
            ElemType& Data;
        };

        std::vector < ContainerElement > MyVector;
        std::vector < ContainerElement > ::iterator MyIterator;

    public:

        // EDIT: that operator== part is incorrect as
        // failed attempt to circumvent inability to compare custom types
        friend bool operator== (IndexType& x, const IndexType& y)
        {
            if (x == y) return 1;
            else return 0;
        }

        const ElemType& GetElem(const IndexType& index)
        {
            try
            {

                MyIterator = MyVector.begin();
                while (MyIterator != MyVector.end())            

                {
                    if (MyIterator->Index == index)
                    // PROBLEM: missing operator "==" for IndexType == const IndexType
                    {
                        // do useful things
                    }
                    MyIterator++;
                }
            }

            catch (Exception e) // everything down below is a placeholder
            {
                throw (ElemNotFound) = 0;
            }
        }

        void PutElem(const IndexType& index, const ElemType& elem)
        {

        }
    };

IndexType和const IndexType的直接比较(使用“==”)因我不知道的原因而无法正常工作。我想比较我的向量中的自定义索引和我在函数中使用的索引来从容器中获取元素。对自定义类型使用运算符重载“==”也不起作用。应该是不正确的继承还是错误使用运算符重载 - 我不知道!

所以问题是:如何比较使用模板的类中的const和非const自定义类型变量?

1 个答案:

答案 0 :(得分:1)

您的代码存在根本问题;你看到的所有其他错误只隐藏真实的错误。这就是这条线:

class Container : public IContainer < class ElemType, class IndexType >

class ElemTypeclass IndexType参数具有误导性。这些实际上是从未定义的类的前向声明。他们的名字与IContainer模板参数名称相同这一事实只是巧合。

换句话说:您正在使用不完整的类来实例化您的模板。

这意味着编译器几乎不了解它们。他们有公共建设者吗?他们甚至支持operator==吗?

考虑这个极其简化的程序版本:

template < class ElemType, class IndexType > class IContainer
{
public:
    virtual void PutElem(const IndexType& index, const ElemType& elem);
};

class Container : public IContainer < class ElemType, class IndexType >
{
public:
    void PutElem(const IndexType& index, const ElemType& elem)
    {
        bool b1 = index == index;
        bool b2 = elem == elem;
    }
};

int main()
{
    Container c;
}

编译错误(取决于您的编译器):

stackoverflow.cpp(12) : error C2676: binary '==' : 'const IndexType' does not define this operator or a conversion to a type acceptable to the predefined operator
stackoverflow.cpp(13) : error C2676: binary '==' : 'const ElemType' does not define this operator or a conversion to a type acceptable to the predefined operator

你有它:类是未定义的,编译器甚至不知道它们是否支持==

其他问题:

  • Container&#39; s GetElem显然应该覆盖基类中的GetElem,但它是const。覆盖区分const和非 - const
  • MyIterator = MyVector.begin();行无法在const函数中使用,因为MyIterator已被修改(并且不是mutable)。
  • 您的模板不适用于int等基本类型,因为如果两个操作数都是基本类型,则不能重载operator==

我不完全确定您的代码的用途是什么,但也许您希望Container成为模板,用于生成Container类?

你可以这样做:

template < class ElemType, class IndexType >
class Container : public IContainer < ElemType, IndexType >

这是起点;然后,您可以单独修复所有其他错误。随意为他们提出个别问题。