【问题标题】:overloading operators in class template类模板中的重载运算符
【发布时间】:2013-03-24 07:31:59
【问题描述】:

我写了一个类模板,但是运算符只有在两种类型相同时才起作用。我不知道如何定义头文件和 cpp 文件中的类型。这是我的代码:

头文件:

ArrayList& operator=(ArrayList const&);

cpp 文件:

template <class T>
ArrayList<T>& ArrayList<T>::operator=(ArrayList<T> const& other) {
    if (this != &other) {
        delete [] Array;
        Array = new T [other.lenght];
        lenght = other.lenght;
        std::copy(other.Array, other.Array+lenght, Array);
    }
    return *this;
}

如果我将 a 和 b 定义为 int,则 a=b 有效。但如果我将 a 定义为 char,则 a=b 不起作用。如何解决?

已编辑::

正如巴里所说,我们必须改变语法。而且我必须在 .cpp 文件末尾更改我的实例化(我使用单独的 .h 和 .cpp 文件)。 但是问题出在这部分

 if (this != &other) {
    delete [] Array;
    Array = new T [other.lenght];
    lenght = other.lenght;
    std::copy(other.Array, other.Array+lenght, Array);
}

但我不知道问题出在哪里,如果我在上面发表评论,一切正常,但是......

我收到了这些错误:

错误 C2440: '!=' : 无法从 'const ArrayList *' 转换为 'ArrayList *const '

错误 C2248:“ArrayList::lenght”:无法访问在“ArrayList”类中​​声明的私有成员(3 次)

【问题讨论】:

  • 您的意思是要将ArrayList&lt;int&gt; 分配给ArrayList&lt;char&gt;
  • 你可能想看看this related question
  • 是的,我知道我应该定义类,但是当我这样做时我会出错
  • @juanchopanza 这不是我的问题,我知道,我的课程适用于两个 ArrayList
  • 我知道这不是你的问题,我只是指出你的代码中有一个明显的错误。

标签: c++ class templates operator-overloading overloading


【解决方案1】:

在您的标题中,而不是:

ArrayList& operator=(ArrayList const&);

做起来

template <typename U>
ArrayList& operator=(ArrayList<U> const&);

这应该接受右侧的任何类型的 U。同样,cpp 文件应该使用这个很棒的结构:

template <typename T>
template <typename U>
ArrayList<T>& ArrayList<T>::operator=(ArrayList<U> const& other) {
    // clearly uninteresting details here
    return *this;
}

【讨论】:

  • 很好的答案,但是给模板类型一个不同的名称是明智的。 T 在这个上下文中已经有了意义。
  • 我用过'template &lt;typename TT&gt;
  • template &lt;typename T&gt;template &lt;class T&gt;有什么区别
  • @Ramyad 在这种情况下没有区别。两者含义相同。
  • 我还是编译错误,这次是未解决的外部符号错误。我认为因为我们使用 typename,并且我没有在 .cpp 末尾实例化它们,所以我有这个错误。
猜你喜欢
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多