C++ - 无法使用运算符重载比较 const 和非常量模板类型
C++ - Cannot compare const and non-const template types using operator overload
我是 Stack Overflow 和 C++ 的新手!那么问题来了:
目标是使用下一个界面创建容器 class:
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 的直接比较(使用“==”)不起作用,原因我不知道。我想比较我的向量中的自定义索引和我在函数中使用的索引以从容器中获取元素。对自定义类型使用运算符重载“==”也不起作用。应该是不正确的继承还是不正确的运算符重载使用 - 我不知道!
所以问题是:如何在使用模板的 class 中比较 const 和非 const 自定义类型变量?
您的代码存在根本问题;您看到的所有其他错误只会隐藏真实的错误。就是这一行:
class Container : public IContainer < class ElemType, class IndexType >
class ElemType
和 class IndexType
论点具有误导性。这些实际上是 classes 的前向声明,它们从未被定义。它们的名称与 IContainer
的 模板参数名称 完全相同,这纯属巧合。
换句话说:您正在用不完整的 classes 实例化您的模板。
这意味着编译器对它们几乎一无所知。他们有 public 构造函数吗?他们甚至支持 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;
}
编译错误(取决于您的编译器):
Whosebug.cpp(12) : error C2676: binary '==' : 'const IndexType' does not define this operator or a conversion to a type acceptable to the predefined operator
Whosebug.cpp(13) : error C2676: binary '==' : 'const ElemType' does not define this operator or a conversion to a type acceptable to the predefined operator
你明白了:classes 是未定义的,编译器甚至不知道它们是否支持 ==
。
其他问题:
Container
的 GetElem
显然应该覆盖基础 class 中的 GetElem
,但它在那里 const
。覆盖区分 const
和非 const
.
MyIterator = MyVector.begin();
行在 const
函数中不起作用,因为 MyIterator
已修改(而不是 mutable
)。
- 您的模板将不适用于像
int
这样的原始类型,因为如果两个操作数都是原始类型,您就不能重载 operator==
。
我不完全确定你的代码的真正意图是什么,但也许你希望 Container
也成为一个模板,用于生成 Container
classes?
您可以这样做:
template < class ElemType, class IndexType >
class Container : public IContainer < ElemType, IndexType >
这是起点;然后您可以单独修复所有其他错误。随时为他们提出个别问题。
我是 Stack Overflow 和 C++ 的新手!那么问题来了:
目标是使用下一个界面创建容器 class:
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 的直接比较(使用“==”)不起作用,原因我不知道。我想比较我的向量中的自定义索引和我在函数中使用的索引以从容器中获取元素。对自定义类型使用运算符重载“==”也不起作用。应该是不正确的继承还是不正确的运算符重载使用 - 我不知道!
所以问题是:如何在使用模板的 class 中比较 const 和非 const 自定义类型变量?
您的代码存在根本问题;您看到的所有其他错误只会隐藏真实的错误。就是这一行:
class Container : public IContainer < class ElemType, class IndexType >
class ElemType
和 class IndexType
论点具有误导性。这些实际上是 classes 的前向声明,它们从未被定义。它们的名称与 IContainer
的 模板参数名称 完全相同,这纯属巧合。
换句话说:您正在用不完整的 classes 实例化您的模板。
这意味着编译器对它们几乎一无所知。他们有 public 构造函数吗?他们甚至支持 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;
}
编译错误(取决于您的编译器):
Whosebug.cpp(12) : error C2676: binary '==' : 'const IndexType' does not define this operator or a conversion to a type acceptable to the predefined operator
Whosebug.cpp(13) : error C2676: binary '==' : 'const ElemType' does not define this operator or a conversion to a type acceptable to the predefined operator
你明白了:classes 是未定义的,编译器甚至不知道它们是否支持 ==
。
其他问题:
Container
的GetElem
显然应该覆盖基础 class 中的GetElem
,但它在那里const
。覆盖区分const
和非const
.MyIterator = MyVector.begin();
行在const
函数中不起作用,因为MyIterator
已修改(而不是mutable
)。- 您的模板将不适用于像
int
这样的原始类型,因为如果两个操作数都是原始类型,您就不能重载operator==
。
我不完全确定你的代码的真正意图是什么,但也许你希望 Container
也成为一个模板,用于生成 Container
classes?
您可以这样做:
template < class ElemType, class IndexType >
class Container : public IContainer < ElemType, IndexType >
这是起点;然后您可以单独修复所有其他错误。随时为他们提出个别问题。