недопустимое использование неполного типа 'class ...' вектор STL - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть несколько вопросов с определением класса, наследующего вектор STL. Предполагается, что этот класс публично наследуется от std :: vector, но я продолжаю получать следующую ошибку от компилятора. Я почти наверняка, что это связано с ошибкой в ​​том числе <vector>, но я не знаю, как это исправить.

In file included from useMVector.cpp
[Error] invalid use of incomplete type 'class MVector<T, size>'
In file included from MVector.cpp
     from useMVector.cpp
[Error] declaration of 'class MVector<T, size>'
recipe for target 'useMVector.o' failed

Соответствующий код указан здесь:

useMVector. cpp:

#include <stdlib.h>
#include "MVector.cpp"

using namespace std;

int main() {
    return 0;
}

MVector.h:

#ifndef _MVECTOR_
#define _MVECTOR_

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;

template<class T, int size>
class MVector : public std::vector<T> {
    public:
        // constructer:
        MVector();
        // operator=, copy constructor and destructor from std::vector
        // iterator from std::vector

        // methodes:

        // addition with vector
        template<class T2>
        MVector<T, size> operator+(const MVector<T2,size>& y);

       ...
};

#endif // _MVECTOR_

MVector. cpp

#include "MVector.h"

template<class T, int size>
MVector<T, size>::MVector() : std::vector<T>::vector(size, 0) {};

template<class T2, class T, int size>
MVector<T,size> MVector<T,size>::operator+(const MVector<T2,size>& y) {

}

1 Ответ

2 голосов
/ 08 апреля 2020
template<class T2, class T, int size>
MVector<T,size> MVector<T,size>::operator+(const MVector<T2,size>& y)

Неправильно, вам действительно нужно объявить два отдельных шаблона, один для класса и один для метода:

template<class T, int size>
template<class T2>
MVector<T,size> MVector<T,size>::operator+(const MVector<T2,size>& y) {

}

Обратите внимание, что включение .cpp файлов, как правило, не правильно подходить. Вы должны реализовать шаблоны в заголовочных файлах. Если вы все еще хотите разделить реализацию, вы можете сделать что-то вроде этого:

Ah:

#pragma once

template<typename T>
class A
{
  A();
};

#include "A_impl.h"

A_impl.h:

template<typename T>
A::A() {}

Вы можете назвать A_impl.h в соответствии с вашими собственными соглашениями, некоторые базы кода используют имена, такие как A.ipp.

Извлечение из std::vector (и большинства других стандартных библиотечных классов) редко уместно, у вас должен быть std::vector член.

...