我的程序使用Microsoft编译器通过VS Code进行编译,但是不会使用Cygwin(通过cygwin终端)进行编译。

错误几乎完全相同,并在类Node(node.h文件)中的每个函数上重复

Node.hpp:5:1: error: redefinition of ‘Node<value_type>::Node(value_type&, Node<value_type>*, Node<value_type>*)’
    5 | Node<value_type>::Node(value_type& newData, Node* next, Node* prev) {

据我了解:Node.hpp文件用于实现,而Node.h文件用于声明。教授的示例包括以类似方式同时使用.h和.hpp文件。

我尝试在Node.h的末尾删除包含“ Node.hpp”。这将创建一组新的错误。

问题:

  1. 我没有正确理解声明模板函数/类的哪一部分?
  2. 如何解决Cygwin上的这些编译错误?

Node.h文件

#ifndef NODE_HEADER
#define NODE_HEADER

#include <cstdlib>
#include <iostream>

template <typename value_type>
class Node {
    public:
        
        //Constructor
        Node(value_type& newData, Node<value_type>* next = NULL, Node<value_type>* prev = NULL);
        //Setter for data
        void setData(value_type newData);
        //Setter for next
        void setNext(Node<value_type>* next);
        //Setter for previous
        void setPrev(Node<value_type>* prev);
        //Accessor for data
        value_type& getData() const;
        //Accessor for next
        Node<value_type>* getNext() const;
        //Accessor for prev
        Node<value_type>* getPrev() const;
        
        //Destructor
        ~Node();
        
        
    private:
        Node<value_type>* n;
        Node<value_type>* p;
        value_type* data;
    
};

template <typename value_type>
std::ostream& operator << (std::ostream& out, Node<value_type>* n);

#include "Node.hpp"
#endif

Node.hpp文件

#include "Node.h"


//Constructor
template <typename value_type>
Node<value_type>::Node(value_type& newData, Node* next, Node* prev) {
    data = new value_type;
    *data = newData;
    n = next;
    p = prev;
}

//Setter for data
template <typename value_type>
void Node<value_type>::setData(value_type newData) {
    delete data;
    data = new value_type;
    *data = newData;
}

//Setter for next
template <typename value_type>
void Node<value_type>::setNext(Node* next) {
    n = next;
}

//Setter for previous
template <typename value_type>
void Node<value_type>::setPrev(Node* prev) {
    p = prev;
}

//Accessor for data
template <typename value_type>
value_type& Node<value_type>::getData() const {
    return *data;
}

//Accessor for next
template <typename value_type>
Node<value_type>* Node<value_type>::getNext() const {
    return n;
}

//Accessor for prev
template <typename value_type>
Node<value_type>* Node<value_type>::getPrev() const {
    return p;
}

template <typename value_type>
std::ostream& operator << (std::ostream& out, Node<value_type>* n) {
    out << n->getData();
    return out;
}

//Destructor
template <typename value_type>
Node<value_type>::~Node() {delete data;}

main.cpp

#include "Node.h"
#include <iostream>

using namespace std;

int main(){
    return 0;
}

生成文件

CC=g++
CFLAGS=-c -Wall -std=c++98 
LDFL

AGS=
SOURCES=Node.h main.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=main

all: $(SOURCES) $(EXECUTABLE)
    
$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

%.o : %.cpp
    $(CC) $(CFLAGS) -c $<

clean:
    rm -rf *.o core

请注意,我是C ++中使用模板的新手,我的大学讲师要求我通过cygwin进行编译。