【问题标题】:Struggling to understand C++ template instantiation努力理解 C++ 模板实例化
【发布时间】:2021-01-24 20:51:28
【问题描述】:

我正在编写一个模板类,然后需要编写测试用例来测试我的代码并验证所有方法是否正常工作。在我的测试文件中,我尝试创建 Collection 的实例,但得到以下错误:“构造函数“Collection”的实例与参数 listC/C++(289) 不匹配”。我定义了一个无参数构造函数,所以我不确定它为什么不起作用。

这是我定义构造函数的类的一部分:

    template <typename Object>
class Collection
{
    // TODO(student): the rest of the template
private:
    Object *objectsArr;
    int maxArrSize = 10;
    int sizeOfCollection = 0;

public:
    Collection()
    {
        objectsArr = new Object[maxArrSize];
    }
    

在测试文件中,我尝试使用以下方法实例化集合:

Collection<int> testCollection = new Collection();

这是我收到错误消息的地方:“没有构造函数实例“集合”与参数 listC/C++(289) 匹配”。

有人可以帮我理解为什么我会收到此错误消息吗?

【问题讨论】:

  • 看来你的意思是一个指针 Collection *testCollection = new Collection();而不是对象 Collection testCollection = new Collection();
  • @VladfromMoscow 我仍然收到同样的错误。在这种情况下我为什么要使用指针?
  • 运算符 new 返回一个指针。
  • 或者只是尝试 Collection&lt;int&gt; testCollection; 而不使用任何类型的 new 语句,它会调用默认构造函数。

标签: c++ templates constructor


【解决方案1】:

运算符 new 返回一个指针。

所以这个声明

Collection<int> testCollection = new Collection<int>();

(忘记在表达式中用new操作符指定模板参数的地方)可以想象如下方式

Collection<int> *p = new Collection<int>();
Collection<int> testCollection = p;

并且编译器试图找到一个声明如下的构造函数

Collection<int>( Collection<int> * );

因为您正在使用 new 运算符返回的指针初始化 Collection&lt;int&gt; 类型的对象。

但是该类没有这样一个只有一个参数的构造函数。

你必须写

Collection<int> *testCollection = new Collection<int>();

【讨论】:

    【解决方案2】:

    您在实例化时缺少指示指针类型的星号和模板参数。正确的代码是

    Collection<int> *testCollection = new Collection<int>();
    

    new 运算符返回一个 指针,指向它在堆内存中分配的类型,因此星号表示指针类型。

    我们还必须在new Collection&lt;int&gt;() 中指明我们想要实例化的模板类型,以便编译器知道要为您的对象保留多少内存。

    为了将来参考,使用诸如std::unique_ptr 之类的智能指针被认为是更好的做法。如果这让您感到困惑,您可以暂时忽略它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多