Ошибка "слишком мало аргументов шаблона" при этом все аргументы в наличии

Извиняюсь, что пихаю сразу весь огромный код, но я правда искренне пытался упростить код - он сразу начинает комплироваться на простых ситуациях. И я искренне не понимаю, почему данный код не компилируется. у меня есть два файла, они могут быть в целом не очень рабочими, но я хочу понять как хотя бы исправить ошибку "слишком мало аргументов шаблона". Я может быть синтаксис неправильно понял. Правильно ли я определяю методы в шаблонном классе?

файл h.h:

#pragma once
#include <memory>
#include <iterator>

template <typename T>
class NotSimpleIterator
{
public:
    using iterator_category = std::random_access_iterator_tag;
    using value_type = T;
    using difference_type = std::ptrdiff_t;
    using pointer = value_type*;
    using reference = value_type*;

    NotSimpleIterator(T* p);

    NotSimpleIterator& operator++();
    NotSimpleIterator operator++(int);
    value_type operator*();
    bool operator==(const NotSimpleIterator& rhs) const;
    bool operator!=(const NotSimpleIterator& rhs) const;

private:
    T* ptr;
    using value_type = T;
};

template <typename T, typename Alloc = std::allocator<T>>
class NotSimpleVector
{
public:
    using iterator = NotSimpleIterator<T>;
    NotSimpleVector();

    size_t size() const noexcept;
    size_t capacity() const noexcept;
    void push_back(const T& a);
    void pop_back();
    void insert();
    T& operator[](size_t index);
    iterator begin();
    iterator end();

private:
    T* arr;
    Alloc alloc;
    size_t sz;
    size_t cp;
};


template<typename T>
NotSimpleVector<T>::NotSimpleVector() : sz(0), cp(2), arr(std::allocator_traits<Alloc>::allocate(alloc, 2)) {}

template<typename T>
size_t NotSimpleVector<T>::size() const noexcept { return sz; }
template<typename T>
size_t NotSimpleVector<T>::capacity() const noexcept { return cp; }

template<typename T>
void NotSimpleVector<T>::push_back(const T& a)
{
    if (sz == cp)
    {
        T* new_arr = std::allocator_traits<Alloc>::allocate(alloc, 2 * cp);
        for (int i = 0; i < sz; ++i)
        {
            std::allocator_traits<Alloc>::construct(alloc, new_arr + i, arr[i]);
            std::allocator_traits<Alloc>::destroy(alloc, arr + i);
        }
        std::allocator_traits<Alloc>::deallocate(alloc, arr, sz);
        arr = new_arr;
    }
    std::allocator_traits<Alloc>::construct(alloc, arr + sz, a);
    ++sz;
}
template<typename T>
void NotSimpleVector<T>::pop_back() { --sz; }

template<typename T>
void NotSimpleVector<T>::insert()
{
    ++sz;
}

template <typename T>
T& NotSimpleVector<T>::operator[](size_t index) { return arr[index]; }
template <typename T>
NotSimpleIterator<T> NotSimpleVector<T>::begin() { return NotSimpleIterator<T>(arr); }
template <typename T>
NotSimpleIterator<T> NotSimpleVector<T>::end() { return NotSimpleIterator<T>(arr + sz); }

template <typename T>
NotSimpleIterator<T>::NotSimpleIterator(T* p) { ptr = p; }
template <typename T>
NotSimpleIterator<T>& NotSimpleIterator<T>::operator++()
{ 
    ++ptr; 
    return *this; 
}

template <typename T>
NotSimpleIterator<T> NotSimpleIterator<T>::operator++(int)
{
    NotSimpleIterator<T> cpy = *this;
    ++(*this);
    return cpy;
}

template <typename T>
T& NotSimpleIterator<T>::operator*() { return *ptr; }
template <typename T>
bool NotSimpleIterator<T>::operator==(const NotSimpleIterator<T>& rhs) const { return this->ptr == rhs.ptr; }
template <typename T>
bool NotSimpleIterator<T>::operator!=(const NotSimpleIterator<T>& rhs) const { return !(*this == rhs); }

файл main.cpp

#include "h.h"
#include <iostream>
using namespace std;

int main()
{
    NotSimpleVector<int> a;
    int n;
    cin >> n;
    int x;
    for (int i = 0; i < n; ++i)
    {
        cin >> x;
        a.push_back(x);
    }
    for (int el : a)
        cout << el << ' ';
}

Пытался на visual C++ компилировать и на G++, но понять, что не так - не могу. Ошибки G++:

h.h:53:37: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 NotSimpleVector<T>::NotSimpleVector() : sz(0), cp(2), arr(std::allocator_traits<Alloc>::allocate(alloc, 2)) {}
                                     ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:56:41: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 size_t NotSimpleVector<T>::size() const noexcept { return sz; }
                                         ^~~~~~~~
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:58:45: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 size_t NotSimpleVector<T>::capacity() const noexcept { return cp; }
                                             ^~~~~~~~
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:61:46: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 void NotSimpleVector<T>::push_back(const T& a)
                                              ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:78:35: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 void NotSimpleVector<T>::pop_back() { --sz; }
                                   ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:81:33: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 void NotSimpleVector<T>::insert()
                                 ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:87:47: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 T& NotSimpleVector<T>::operator[](size_t index) { return arr[index]; }
                                               ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:89:48: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 NotSimpleIterator<T> NotSimpleVector<T>::begin() { return NotSimpleIterator<T>(arr); }
                                                ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:91:46: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 NotSimpleIterator<T> NotSimpleVector<T>::end() { return NotSimpleIterator<T>(arr + sz); }
                                              ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:111:4: error: prototype for 'T& NotSimpleIterator<T>::operator*()' does not match any in class 'NotSimpleIterator<T>'
 T& NotSimpleIterator<T>::operator*() { return *ptr; }
    ^~~~~~~~~~~~~~~~~~~~
h.h:19:13: error: candidate is: NotSimpleIterator<T>::value_type NotSimpleIterator<T>::operator*()
  value_type operator*();
             ^~~~~~~~

Visual C++ дает следующее:

Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   57  
Ошибка  C2100   недопустимое косвенное обращение    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\ConsoleApplication9.cpp   16  
Ошибка  C2244   NotSimpleIterator<T>::operator *: не удается сопоставить определение функции существующему объявлению   ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   112 
Ошибка  C2264   NotSimpleVector<int,std::allocator<T>>::NotSimpleVector: ошибка в определении или объявлении функции; функция не вызвана    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\ConsoleApplication9.cpp   7   
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   54  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   59  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   77  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   79  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   85  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   88  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   90  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   92  
Ошибка  C3536   <begin>$L0: не может использоваться до инициализации    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\ConsoleApplication9.cpp   16  
Ошибка  C3536   <end>$L0: не может использоваться до инициализации  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\ConsoleApplication9.cpp   16  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   54  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   57  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   59  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   63  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   79  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   83  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   88  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   90  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   92  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   54  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   66  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   69  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   70  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   72  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   75  
Ошибка (активно)    E0147   объявление несовместимо с "NotSimpleIterator<T>::value_type NotSimpleIterator<T>::operator*()" (объявлено в строке 20 из "C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h")   ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   112 
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   54  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   57  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   59  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   62  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   79  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   82  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   88  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   90  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   92  
Ошибка (активно)    E1670   квалификатор типа не разрешен на функции не элементам   ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   57  
Ошибка (активно)    E1670   квалификатор типа не разрешен на функции не элементам   ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   59  

Visual C++ дает ошибку "слишком мало аргументов шаблона" намекая, что например в строчке NotSimpleVector<T>::NotSimpleVector() недостает каких то аргументов. Но я не понимаю, что ему еще нужно. Подобная же ошибка при этом у меня вроде все хорошо

Ну в целом итоговый вопрос: В чем причина ошибок компиляции? Косяк синтаксиса? Или какая то более тяжелая проблема? Я естественно не заставляю весь код заставлять работать, может мне вообще полкласса придется переделывать.


Ответы (1 шт):

Автор решения: Harry

Ну смотрите: вы объявили свой вектор с двумя шаблонными параметрами, а в конструкторе указали один. В самом конструкторе есть упоминание Alloc, но откуда же компилятору знать, что это, если он не объявлен в строке template?

template<typename T, typename Alloc>
NotSimpleVector<T,Alloc>::NotSimpleVector() : sz(0), cp(2),
                arr(std::allocator_traits<Alloc>::allocate(alloc, 2)) {}

Дальше - больше.

template<typename T, typename Alloc>
size_t NotSimpleVector<T,Alloc>::size() const noexcept { return sz; }

Надо указывать Alloc и тут, и в последующих таких функциях.

Ну, а в операторе * надо еще и возвращаемый тип верно указать:

template <typename T>
NotSimpleIterator<T>::value_type NotSimpleIterator<T>::operator*() { return *ptr; }
→ Ссылка