Как создать шаблон вектора для шаблонного объекта? VS бросает C3203 - PullRequest
0 голосов
/ 04 ноября 2018

Здравствуйте, я создал шаблон

Ниже находится заголовочный файл:

#pragma once
#include <iostream>
using namespace std;

template <class T>
class Airplane {
private: 
    T model;
    int counter; 
public:
    Airplane(T model);
};

.cpp файл:

#include "pch.h"
#include "Airplane.h"
#include <string>

template <class T>
Airplane<T>::Airplane(T model) {
    if (&model != NULL)
        this->model = model;
        this->counter = 1;
}

Затем был создан шаблон набора, который может принимать любой тип данных или мой созданный шаблон Самолет, но набор должен содержать уникальные объекты.

установить заголовочный файл:

#pragma once
#include <vector>
#include <iostream>
using namespace std;

template <class T>
class set {
private:
    vector <T> setvector;
public:
    set();
    void insert(T obj);
};

установить .cpp файл:

#include "pch.h"
#include "set.h"
#include <iterator>

template <class T>
set<T>::set() {

    class vector<T>::iterator vi = this->setvector.begin();
}

template <class T>
void set<T>::insert(T obj) {    
    if (this->setvector.empty()) {
        this->setvector.push_back(obj);
    }
    else {
        class vector<T>::iterator vi = this->setvector.begin(); 
        bool flag = false;
        while (vi != this->setvector.end()) {
            if (*vi == obj) {
                flag = true;
                break;
            }
            vi++;
        }
        if (flag == false)
            this->setvector.push_back(obj);
    }

в основном методе, когда я пытался использовать набор с помощью int или doulbe, он работает отлично, однако, когда я пытаюсь создать новый набор с помощью моего шаблона "Самолет", VS выдает ошибку

C3203   'Airplane': unspecialized class template can't be used as a template argument for template parameter 'T', expected a real type.

Я пытался создать специализацию для моего шаблона, но C ++ не примет его, так как кажется, что это шаблон. Я пытался использовать template <template <class> class T> в заданном шаблоне, но все равно не работал.

1 Ответ

0 голосов
/ 04 ноября 2018

1) Вы не должны использовать

  using namespace std;

в заголовочных файлах.

2) Шаблоны должны быть определены в заголовочных файлах, а не в файлах cpp. Вы можете прочитать об этом здесь

3) Ваша проблема, кажется, вы пытаетесь позвонить

  set<Airplane> s;

set - это шаблон класса, который принимает некоторый тип. Ваш код работает для int и double, потому что они являются типами. Airplane не тип . Это шаблон, вы можете получить введите из шаблона, создав его экземпляр, поэтому вам нужно предоставить один аргумент в списке аргументов шаблона (<>) для самолета.

  Airplane<int>

Например, если вы хотите иметь set из Airplane<int> объектов, напишите:

  set< Airplane<int> > mySet;

Кроме того, вы должны добавить operator== для сравнения объектов самолетов. Без этого вы получите ошибки в этой строке if (*vi == obj) { в insert метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...