-1

我们刚刚在我的 comp sci 课程中介绍了泛型和模板。我被要求创建一个支持任何数据类型的存储和检索的通用容器类。我的所有功能都可以正常工作,除了调整数组大小时。我在我的插入函数中调用了调整大小:

template< typename T >
void Container< T >::insert( T  magic)
{
    if (index == size)
    {
        resize();
    }
    containerPtr[index] = magic;
    index++;
}

size 变量是数组的大小,索引是下一个插入位置。

这是我的调整大小功能:

template< typename T >
void Container< T >::resize()
{
    int doubSize = size * 2;
    Container< T > temp(doubSize);
    for (int i = 0; i < size; i++)
    {
        temp[i] = containerPtr[i];      // error 1 here
    }
    *containerPtr = temp;               // error 2 here
    size = doubSize;
}

我的超载=

template< typename T >
const T Container< T >::operator=(const T& rhs)
{
    if(this == &rhs)
    {
        return *this;
    }
    return *rhs;
}

尝试编译时收到以下错误:

1: error C2676: binary '[': 'Container<T>' does not define this operator or a conversion to a type acceptable to the predefined operator
2: error C2679: binary '=': no operator found which takes a right-hand operand of type 'Container<T>' (or there is no acceptable conversion)

我不确定我在哪里出错了......

4

3 回答 3

3

这个错误

temp[i] = containerPtr[i];      // error 1 here

很可能是因为您没有定义 anoperator[](size_t)来允许您使用方括号访问容器的元素。您需要像这些 const 和非常量运算符之类的东西:

T& operator[](std::size_t index) { return containerPtr[index]; }
const T& operator[](std::size_t index) const { return containerPtr[index]; }

假设containerPtr是某种动态大小的数组保存T对象。而这一行:

*containerPtr = temp;               // error 2 here

是错的。的类型*containerPtrT,并且您正在尝试将 a 分配Container<T>给 a T。这不太可能奏效。

我建议您使用std::copy而不是循环分配分配,尽管我意识到这可能违反您分配的精神。

于 2012-11-27T15:30:45.083 回答
1

2:错误 C2679:二进制“=”:未找到采用“容器”类型的右侧操作数的运算符(或没有可接受的转换)

是更重要的错误,它表明你相信的类型是什么

*containerPtr = 温度;

这行代码不正确。不可能将 a 分配给container<T>您正在尝试做的 T 值。在将 temp 更改为指向具有正确大小的动态分配的 T 数组的指针后(并删除分配中的指针 deref),其他错误将自行消失。请注意,您还需要修复忘记删除前一个数组的内存泄漏。

于 2012-11-27T15:36:05.637 回答
0

错误 1:很确定您必须operator[]为您的 Container 类定义

错误2:重载时应使用以下签名operator=

template< typename T >
const T Container<T>::operator=(const Container<T>& rhs)
{ 
   ...
}
于 2012-11-27T15:30:43.637 回答