RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 970780
Accepted
alex-rudenkiy
alex-rudenkiy
Asked:2020-04-17 20:00:32 +0000 UTC2020-04-17 20:00:32 +0000 UTC 2020-04-17 20:00:32 +0000 UTC

模板的问题

  • 772

请告诉我为什么我不能用模板实现接口?

队列.h

#ifndef UNTITLED104_QUEUE_H
#define UNTITLED104_QUEUE_H

#include <vector>
#include <cstdio>

using namespace std;

template <typename T>
class Node{
private:
    T value;
public:
    Node *next_node, *back_node;

    Node():next_node(NULL),back_node(NULL){};
    Node(T new_value):value(new_value),next_node(NULL),back_node(NULL){};

    T getValue();
    void setValue(T new_value);
    void deleteNode();
    Node* getNext();
    Node* getBack();
};

template <typename T>
class Queue{
private:
    Node<T>* firstNode=NULL;
    unsigned size=0;
public:
    Queue(T value);
    Node<T>* getFirst();
    Node<T>* getNode(int position);
    unsigned int getSize();
    Node<T>* insert_after(int position, T value);
};

#endif //UNTITLED104_QUEUE_H

队列.cpp

#include "Queue.h"

template<typename T>
T Node<T>::getValue() {
    return nullptr;
}

template<typename T>
void Node<T>::setValue(T new_value) {
}

template<typename T>
void Node<T>::deleteNode() {
}

template<typename T>
Node *Node<T>::getNext() {
    return nullptr;
}

template<typename T>
Node *Node<T>::getBack() {
    return nullptr;
}




template<typename T>
Queue<T>::Queue(T value) {
}

template<typename T>
Node<T> *Queue<T>::getFirst() {
    return nullptr;
}

template<typename T>
Node<T> *Queue<T>::getNode(int position) {
    return nullptr;
}

template<typename T>
unsigned int Queue<T>::getSize() {
    return 0;
}

template<typename T>
Node<T> *Queue<T>::insert_after(int position, T value) {
    return nullptr;
}

错误:

C:\Users\Alex\CLionProjects\untitled104\Queue.cpp:21:1: error: invalid use of template-name 'Node' without an argument list
 Node *Node<T>::getNext() {
 ^
C:\Users\Alex\CLionProjects\untitled104\Queue.cpp:26:1: error: invalid use of template-name 'Node' without an argument list
 Node *Node<T>::getBack() {
 ^
c++
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    AnT stands with Russia
    2020-04-17T21:20:15Z2020-04-17T21:20:15Z

    它只是类范围内的Node同义词。Node<T>在此范围之外,您将始终必须使用 "full" Node<список аргументов шаблона>。

    如果模板方法的定义Node<T>是在模板类之外完成的,那么由于上述原因,在返回类型中,您不能再缩短Node<T>到Node使用“经典”语法时。正确

    template<typename T>
    Node<T> *Node<T>::getNext() {
        return nullptr;
    }
    

    但是,如果模板类型规范很长并且您不想重复两次,则可以使用新语法

    template<typename T>
    auto Node<T>::getNext() -> Node * {
        return nullptr;
    }
    

    在这种情况下,您可以使用右侧的“短”名称Node。

    而且,正如您已经被告知的,不应将模板实体的定义提取到.cpp文件中。即使你把它们放在类之外,它们仍然应该放在头文件中,紧挨着类定义。


    ;在类中定义方法后附加

    Node():next_node(NULL),back_node(NULL){};
                                            ^
    

    不是错误,而是不必要的空声明。

    也不清楚为什么在一个类中直接在类定义中为字段使用初始化器,而在另一个类中则顽固地拒绝。

    • 3
  2. aeiklorvy
    2020-04-17T20:10:58Z2020-04-17T20:10:58Z

    发生错误是因为该类Node缺少模板参数。next_node将and字段的类型更改back_node为,以及and方法Node<T> *的返回类型。getNextgetBack

    • 1
  3. Vlad from Moscow
    2020-04-17T21:12:59Z2020-04-17T21:12:59Z

    首先,您应该将整个模板类定义(包括它们的成员)放在标题中。

    其次,在某些函数中,您忘记定义模板标识符。

    template<typename T>
    Node<T> * Node<T>::getNext() 
    {
        return nullptr;
    }
    
    template <typename T>
    Node<T> * Node<T>::getBack() 
    {
        return nullptr;
    }
    

    以下是标题以及相应的更改。

    #ifndef UNTITLED104_QUEUE_H
    #define UNTITLED104_QUEUE_H
    
    #include <vector>
    #include <cstdio>
    
    using namespace std;
    
    template <typename T>
    class Node
    {
    private:
        T value;
    public:
        Node *next_node, *back_node;
    
        Node() : next_node( nullptr ),back_node( nullptr )
        {
        }
    
        Node( const T &new_value ) : value( new_value ), next_node( nullptr ), back_node( nullptr )
        {
        }
    
        T getValue() const;
        void setValue( const T &new_value );
        void deleteNode();
        Node* getNext();
        Node* getBack();
    };
    
    template <typename T>
    class Queue{
    private:
        Node<T>* firstNode = nullptr;
        size_t size = 0;
    public:
        Queue( const T &value );
        Node<T> * getFirst();
        Node<T> * getNode( size_t position );
        size_t getSize() const;
        Node<T> * insert_after( size_t position, const T &value );
    };
    
    template <typename T>
    T Node<T>::getValue() const
    {
        return nullptr;
    }
    
    template <typename T>
    void Node<T>::setValue( const T &new_value ) 
    {
    }
    
    template <typename T>
    void Node<T>::deleteNode() 
    {
    }
    
    template<typename T>
    Node<T> * Node<T>::getNext() 
    {
        return nullptr;
    }
    
    template <typename T>
    Node<T> * Node<T>::getBack() 
    {
        return nullptr;
    }
    
    
    template <typename T>
    Queue<T>::Queue( const T &value ) 
    {
    }
    
    template <typename T>
    Node<T> * Queue<T>::getFirst() 
    {
        return nullptr;
    }
    
    template <typename T>
    Node<T> * Queue<T>::getNode( size_t position ) 
    {
        return nullptr;
    }
    
    template <typename T>
    size_t Queue<T>::getSize() const 
    {
        return 0;
    }
    
    template <typename T>
    Node<T> * Queue<T>::insert_after( size_t position, const T &value ) 
    {
        return nullptr;
    }
    
    #endif //UNTITLED104_QUEUE_H
    
    • 1

相关问题

Sidebar

Stats

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

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • 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