RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1405010
Accepted
Learpcs
Learpcs
Asked:2022-06-29 18:57:38 +0000 UTC2022-06-29 18:57:38 +0000 UTC 2022-06-29 18:57:38 +0000 UTC

所有可用参数的“模板参数太少”错误[关闭]

  • 772
关闭 这个问题是题外话。目前不接受回复。

寻求调试帮助的问题(“为什么这段代码不起作用? ”)应该包括期望的行为、具体的问题或错误,以及在问题中重现它的最少代码。没有明确描述问题的问题对其他访问者毫无用处。请参阅如何创建一个最小的、独立的和可重现的示例。

5 个月前关闭。

改进问题

我很抱歉一次推送所有巨大的代码,但我真的真诚地尝试简化代码 - 它会立即开始在简单的情况下编译。我真的不明白为什么这段代码不能编译。我有两个文件,它们通常可能不能很好地工作,但我想了解如何至少修复“模板参数太少”错误。我可能误解了语法。我是否正确定义了模板类中的方法?

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()某行中缺少某些参数。但我不明白他还需要什么。我有同样的错误,一切似乎都很好

好吧,总的来说,最后一个问题:编译错误的原因是什么?语法不行?还是更严重的问题?当然,我不会强迫所有的代码都工作,也许我一般需要重做一半的课程。

c++ шаблоны-с++
  • 1 1 个回答
  • 73 Views

1 个回答

  • Voted
  1. Best Answer
    Harry
    2022-06-29T19:03:51Z2022-06-29T19:03:51Z

    好吧,看:你用两个模板参数声明了你的向量,并在构造函数中指定了一个。构造函数本身有提到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; }
    
    • 1

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5