【问题标题】:use of class template requires argument list使用类模板需要参数列表
【发布时间】:2013-11-07 16:37:44
【问题描述】:

首先,这是我正在创建的矢量类,其基本功能类似于标准库矢量。我们现在正在尝试将其作为类模板。

我查看了一些人们为这个错误而苦苦挣扎的例子,但我觉得我声明我的函数的方式很好,所以我看不到问题所在。这是我的声明,

template <typename T>
class MyVector
{
public:
const MyVector& operator=(const MyVector&);
...
}

实现代码。

template <typename T>
MyVector<T>::MyVector(const MyVector& b)
{
//set the vcapacity/vsize equal to the object passed to setup for a new deep copy
vcapacity = b.vcapacity;
vsize = b.vsize;

//allocate space for a new varray that is the copy
varray = new T[vcapacity];

//copy the data into the new array
for (int i = 0; i < vsize; i++)
{
    this->varray[i] = b.varray[i];
}
}

所以我基本上得到了 2 个错误,我认为它们指的是同一件事。第一个指向我在模板行之后的第一行实现,说“使用类模板需要参数列表”,第二个指向实现代码的结尾,说明“无法将函数定义与现有声明匹配”。

有什么想法吗?

【问题讨论】:

  • 请同时添加实际的完整错误消息和引用的行。

标签: c++ class templates


【解决方案1】:

您的构造函数参数在实现中缺少模板参数:

template <typename T>
MyVector<T>::MyVector(const MyVector<T>& b)
//                                  ^^^

【讨论】:

    【解决方案2】:
    const MyVector& operator=(const MyVector&);
    

    应该是

    MyVector& operator=(const MyVector&);
    

    See Here for why

    对于错误,在实现中使用模板参数:

    const MyVector<T>&
    

    (顺便说一句,您知道您向我们提供了operator= 的声明和复制构造函数的实现吗?:-))

    不管怎样,这样想——在实现中实际上没有这样的类,如MyVector,一旦添加了模板参数,就有只有一个类.

    【讨论】:

    • 不正确。在这种情况下,MyVectorMyVector&lt;T&gt; 相同。
    • 最小反例:template &lt;class T&gt; struct vec{ const vec&amp; operator=(const vec&amp;){ return *this; } };,编译正常。
    • 这并不完全正确。您引用的行是有效的。错误在别处。应该按照您的建议修改错误的行,而不是这一行。
    • 我是出于习惯而输入的,我总是“说出我的意思”,但我实际上是想提请注意去掉 const。我将更新并解释为什么也要删除 const。
    【解决方案3】:

    实现的第一行紧跟在模板类定义的最后一行之后,您是否在您发布的代码中在该定义的结束 } 之后省略了 ;?当头文件以类定义结尾而不以;结尾时,可能会导致下一个包含文件中出现错误消息(由我犯)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多