Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 努力理解C++;模板实例化_C++_Templates_Constructor - Fatal编程技术网

C++ 努力理解C++;模板实例化

C++ 努力理解C++;模板实例化,c++,templates,constructor,C++,Templates,Constructor,我正在编写一个模板类,然后需要编写测试用例来测试我的代码并验证所有方法是否正常工作。在我的测试文件中,我试图创建一个集合实例,但得到以下错误:“没有构造函数“集合”的实例与参数listC/C++(289)匹配”。我定义了一个无参数构造函数,所以我不确定它为什么不工作 下面是我的类中定义构造函数的部分: template <typename Object> class Collection { // TODO(student): the rest of the temp

我正在编写一个模板类,然后需要编写测试用例来测试我的代码并验证所有方法是否正常工作。在我的测试文件中,我试图创建一个集合实例,但得到以下错误:“没有构造函数“集合”的实例与参数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];
    }
    

模板
类集合
{
//TODO(学生):模板的其余部分
私人:
Object*objectsArr;
int maxArrSize=10;
int-sizeOfCollection=0;
公众:
收藏()
{
objectsArr=新对象[maxArrSize];
}
在测试文件中,我尝试使用以下内容实例化集合:

Collection<int> testCollection = new Collection();
Collection testCollection=new Collection();
这就是我得到错误消息的地方:“没有构造函数“Collection”的实例与参数listC/C++(289)匹配”


有人能帮我理解为什么我会收到这个错误消息吗?

新操作符返回一个指针

所以这个宣言

Collection<int> testCollection = new Collection<int>();
Collection testCollection=new Collection();
(您忘记在表达式中使用运算符new指定模板参数)可以想象如下

Collection<int> *p = new Collection<int>();
Collection<int> testCollection = p;
Collection*p=newcollection();
集合testCollection=p;
编译器试图找到一个声明如下的构造函数

Collection<int>( Collection<int> * );
Collection(Collection*);
因为您正在使用new运算符返回的指针初始化
集合
类型的对象

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

你必须写作

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

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

Collection<int> *testCollection = new Collection<int>();
Collection*testCollection=newcollection();
new
操作符返回一个指针,指向它在堆内存中分配的类型,因此星号表示指针类型

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


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

您的意思似乎是指针集合*testCollection=new Collection();而不是对象集合testCollection=new Collection();@VladFrommosco我仍然收到相同的错误。在这种情况下为什么要使用指针?new运算符返回指针。或者只需尝试
Collection testCollection;
而不使用任何调用默认构造函数的
new
语句。