我很抱歉一次推送所有巨大的代码,但我真的真诚地尝试简化代码 - 它会立即开始在简单的情况下编译。我真的不明白为什么这段代码不能编译。我有两个文件,它们通常可能不能很好地工作,但我想了解如何至少修复“模板参数太少”错误。我可能误解了语法。我是否正确定义了模板类中的方法?
hh 文件:
#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()
某行中缺少某些参数。但我不明白他还需要什么。我有同样的错误,一切似乎都很好
好吧,总的来说,最后一个问题:编译错误的原因是什么?语法不行?还是更严重的问题?当然,我不会强迫所有的代码都工作,也许我一般需要重做一半的课程。