我的程序使用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”。这将创建一组新的错误。
问题:
- 我没有正确理解声明模板函数/类的哪一部分?
- 如何解决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进行编译。