在C ++中实例化模板类类型的对象

时间:2018-03-30 06:27:28

标签: c++ templates constructor

我遇到了在C ++中实例化模板类类型的对象的麻烦。

以下是代码:

Array.h:

//Developed by Trofimov Yaroslav on 30.03.2018

#ifndef _ARRAY_H_TROFIMOV_
#define _ARRAY_H_TROFIMOV_

template<size_t n, typename T>
class Array
{
        static unsigned __freeId, __quantity;
        unsigned _id;

        T* _array;
public:
        template<size_t n, typename T>
        Array(void);
        ~Array(void);
        T& operator[](const size_t);
};
#include "Array.cpp"

#endif

Array.cpp:

//Developed by Trofimov Yaroslav on 30.03.2018
#include "Array.h"

template<size_t n, typename T>
Array::Array(void) 
    : _id(++__freeId), _array(new T[]) {

}

template<size_t n, typename T>
Array::~Array(void) {

}

template<size_t n, typename T>
T& Array::operator[](const size_t i) {

}

Main.cpp的:

//Developed by Trofimov Yaroslav on 30.03.2018
#include <iostream>
#include "Array.h"

int main(void) {
    Array<7, int> a;
    return 0;
}

现在,当我将鼠标悬停在a的{​​{1}}上时,我会看到以下内容:

  

错误:类“Array&lt; 7U,int&gt;”

没有默认构造函数

但是正如您所看到的,默认模板构造函数确实存在。那么,我在这里错过了什么?

2 个答案:

答案 0 :(得分:0)

在类中声明方法或构造函数时,您不需要使用模板。您声明的构造函数是模板化类中的模板化方法,而不是默认构造函数。

我永远不会依赖智能感知中的错误,有时它是完全错误的,运行编译器通常会产生更准确更详细的错误信息。

答案 1 :(得分:0)

您的代码中存在多个错误。

在您的标头文件中,您需要从构造函数中删除额外的template,它不属于那里。

在您的cpp文件中,您需要将所有Array::替换为Array<n, T>::。您的构造函数需要将n传递给new[]。你的析构函数需要delete[]数组。 operator[]需要返回一些内容。

您的类有static个成员,因此您还需要实例化它们的实例。

试试这个:

Array.h

#ifndef _ARRAY_H_TROFIMOV_
#define _ARRAY_H_TROFIMOV_ 

template<size_t n, typename T>
class Array
{
        static unsigned __freeId, __quantity;
        unsigned _id;

        T* _array;
public:
        Array(void);
        ~Array(void);
        T& operator[](const size_t);
};

#include "Array.cpp"

#endif

Array.cpp

#include "Array.h" 

template<size_t n, typename T>
Array<n, T>::Array(void) 
    : _id(++__freeId), _array(new T[n]) {
}

template<size_t n, typename T>
Array<n, T>::~Array(void) {
    delete[] _array;
}

template<size_t n, typename T>
T& Array<n, T>::operator[](const size_t i) {
    return _array[i];
}

Main.cpp的

#include "Array.h"

template<> unsigned Array<7, int>::__freeId = 0;
template<> unsigned Array<7, int>::__quantity = 0;

int main() {
    Array<7, int> a;
    return 0;
}

Live deno