我遇到了在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;”
没有默认构造函数
但是正如您所看到的,默认模板构造函数确实存在。那么,我在这里错过了什么?
答案 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;
}