Създайте екземпляр на обект от тип клас шаблон в C++

Имам проблеми с инстанцирането на обект от тип шаблонен клас в 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 в Main.cpp, виждам следното:

Грешка: не съществува конструктор по подразбиране за клас "Array‹7U, int>"

Но както можете да видите, конструкторът на шаблони по подразбиране съществува. И така, какво пропускам тук?


person ggghahaha    schedule 30.03.2018    source източник
comment
template<size_t n, typename T> Array(void); --› Array(); stackoverflow.com/questions/495021/   -  person llllllllll    schedule 30.03.2018
comment
@liliscent, благодаря. Прочетох публикацията преди, но все още не мога да се справя с проблема си тук.   -  person ggghahaha    schedule 30.03.2018
comment
@ggghahaha, както каза liliscent, трябва да премахнете допълнителния template от конструктора, той не е там. Освен това във вашия cpp файл трябва да замените всички Array:: с Array<n, T>::   -  person Remy Lebeau    schedule 30.03.2018
comment
C++ извиква явен шаблонен конструктор   -  person songyuanyao    schedule 30.03.2018
comment
@RemyLebeau, след като замених първия Array:: и премахнах template, получих грешката като грешен синтаксис. Затова не виждам полза от вашите съвети.   -  person ggghahaha    schedule 30.03.2018
comment
@ggghahaha това, което казах по-рано, важи. Но има и други грешки в кода, които също трябва да бъдат поправени. След това работи добре.   -  person Remy Lebeau    schedule 30.03.2018


Отговори (2)


Има множество грешки в кода ви.

Във вашия заглавен файл трябва да премахнете допълнителния 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;
}

Демонстрация на живо

person Remy Lebeau    schedule 30.03.2018
comment
Доколкото разбрах, е невъзможно да се използва .cpp за имплементация на шаблон и в същото време да не се създаде специализация на шаблона преди използването му. Прав ли съм? - person ggghahaha; 31.03.2018
comment
@ggghahaha Можете да отделите декларациите на шаблони от дефинициите, стига да са направени в една и съща единица за превод, което прави този код, като има .h файла #include .cpp файла. Ако се опитате да компилирате .cpp като негова собствена единица, тогава няма да работи. - person Remy Lebeau; 31.03.2018

Не е необходимо да използвате шаблон, когато декларирате методи или конструктори във вашия клас. Конструкторът, който сте декларирали, е шаблонен метод в рамките на шаблонен клас, а не конструктор по подразбиране.

Никога не бих разчитал на грешки от intellisense, понякога е просто грешно, стартирането на компилатора обикновено ще произведе по-точни, по-подробни съобщения за грешка.

person Alan Birtles    schedule 30.03.2018
comment
Просто изтрийте оператора на шаблона от вашата декларация на конструктора, след което стартирайте компилатора, който ще ви каже следващата ви грешка - person Alan Birtles; 30.03.2018
comment
Така че по същество не ми помагате да реша проблема, а го променяте с друг. За какво го правиш? Винаги мога да изтрия целия си код и да напиша някакви безсмислици, за да получа друг - различен от моята грешка. И вие просто ми предлагате да направя това. Благодаря ви, но нямам нужда от такава помощ. - person ggghahaha; 30.03.2018