C++ 类别';不命名类型';模板文件中出现错误

C++ 类别';不命名类型';模板文件中出现错误,c++,templates,C++,Templates,我一直在试图找出编译器中出现错误的原因,在模板文件“Node.template”中声明“Node没有命名类型” 我是新来的类模板,并已四处寻找答案,但我仍然无法解决这个特殊的问题 以下是这两个文件的代码: //Node.h #ifndef NODE_CAMERON_H #define NODE_CAMERON_H #include <string> using namespace std; namespace oreilly_A2 { template <typen

我一直在试图找出编译器中出现错误的原因,在模板文件“Node.template”中声明“
Node
没有命名类型”

我是新来的类模板,并已四处寻找答案,但我仍然无法解决这个特殊的问题

以下是这两个文件的代码:

//Node.h
#ifndef NODE_CAMERON_H
#define NODE_CAMERON_H
#include <string>

using namespace std;

namespace oreilly_A2 {
    template <typename Obj>
class node {

public:
typedef std::string value_type;

node(); //constructor for node

node(const value_type& val, Obj* newNext); //constructor with parameters

void set_data(const value_type& new_data); //set the word that this node contains

void set_link(Obj* new_link); //set the 'next' Obj
void set_previous(Obj* new_prev);

value_type data() const; //return this node's word

const Obj* link() const; //return next

const Obj* back() const;

Obj* link(); //return next

Obj* back(); 

private:

Obj* next; //the next Obj
Obj* previous;
value_type word; //the word this node contains

};
}
#include "Node.template"
#endif
//Node.h
#ifndef节点\u CAMERON\u H
#定义节点
#包括
使用名称空间std;
名称空间oreilly_A2{
模板
类节点{
公众:
typedef std::字符串值\u类型;
node();//节点的构造函数
node(const value_type&val,Obj*newNext);//带参数的构造函数
void set_data(const value_type&new_data);//设置此节点包含的字
void set_link(Obj*new_link);//设置“下一个”Obj
无效设置为上一个(对象*新设置为上一个);
value_type data()const;//返回此节点的字
const Obj*link()const;//返回下一步
常量Obj*back()常量;
Obj*link();//返回下一步
Obj*back();
私人:
Obj*next;//下一个Obj
Obj*以前的;
value\u type word;//此节点包含的单词
};
}
#包括“Node.template”
#恩迪夫
Node.template文件:

//Node.template
template <typename Obj>
node<Obj>::node(const node::value_type& val=value_type(), Obj* newNext=NULL) {
    word = val;
    next = newNext;
}

template <typename Obj>
node<Obj>::~node() {}

template <typename Obj>
void node<Obj>::set_data(const value_type& new_data){
        word = new_data;
}


template <typename Obj>
void node<Obj>::set_link(Obj* new_link){
        next = new_link;

}


template <typename Obj>
void node<Obj>::set_previous(Obj* new_prev) {
        previous = new_back;
}


template <typename Obj>
value_type node<Obj>::data() const {  //return the word
        return word;
}


template <typename Obj>
const Obj* node<Obj>::link() const { //return next node (const function)
        return next;
}


template <typename Obj>
const Obj* node<Obj>::back() const { //return previous node (const)
        return previous;
}


template <typename Obj>
Obj* node<Obj>::link() {
        return next; //return next node (non-const)
}


template <typename Obj>
Obj* node<Obj>::back() { //return previous node (const)
        return previous;
}
//Node.template
模板
node::node(const node::value_type&val=value_type(),Obj*newNext=NULL){
word=val;
next=newNext;
}
模板
节点::~node(){}
模板
无效节点::设置数据(常量值类型和新数据){
word=新的_数据;
}
模板
无效节点::设置链接(Obj*新建链接){
next=新链接;
}
模板
无效节点::设置上一个(对象*新的上一个){
上一个=新的返回;
}
模板
value\u type node::data()const{//返回单词
返回词;
}
模板
const Obj*node::link()const{//返回下一个节点(const函数)
下一步返回;
}
模板
const Obj*node::back()const{//返回上一个节点(const)
返回上一个;
}
模板
Obj*节点::链接(){
return next;//返回下一个节点(非常量)
}
模板
Obj*node::back(){//返回上一个节点(const)
返回上一个;
}

您在命名空间中声明了类模板

…但在定义其成员函数时忘记了名称空间

实际上,没有名为
node
的类型,只有名为
oreilly\u A2::node
(∀ <代码>Obj)

您需要在Node.template中使用
名称空间oreilly\u A2{
}


另外,请停止在头文件中使用命名空间std写入

您在命名空间中声明了类模板

…但在定义其成员函数时忘记了名称空间

实际上,没有名为
node
的类型,只有名为
oreilly\u A2::node
(∀ <代码>Obj

您需要在Node.template中使用
名称空间oreilly\u A2{
}


另外,请停止在头文件中使用命名空间std写入

您在命名空间中声明了类模板

…但在定义其成员函数时忘记了名称空间

实际上,没有名为
node
的类型,只有名为
oreilly\u A2::node
(∀ <代码>Obj

您需要在Node.template中使用
名称空间oreilly\u A2{
}


另外,请停止在头文件中使用命名空间std写入

您在命名空间中声明了类模板

…但在定义其成员函数时忘记了名称空间

实际上,没有名为
node
的类型,只有名为
oreilly\u A2::node
(∀ <代码>Obj

您需要在Node.template中使用
名称空间oreilly\u A2{
}


另外,请停止在头文件中使用命名空间std写入

定义您正在使用命名空间std时,没有理由使用std::string。你可以简单地把字符串。我认为在头文件中包含名称空间是一种糟糕的编码实践,因为它可能与后面的其他名称空间发生冲突。例如,如果您在主cpp中包含头,然后决定使用名称空间boost。您的程序将出现函数问题。例如std::begin()和boost::begin()。通过在函数之前使用名称空间可以消除此问题,但如果要这样做,则不需要“使用名称空间std;”。定义使用名称空间std时,没有理由使用std::string。你可以简单地把字符串。我认为在头文件中包含名称空间是一种糟糕的编码实践,因为它可能与后面的其他名称空间发生冲突。例如,如果您在主cpp中包含头,然后决定使用名称空间boost。您的程序将出现函数问题。例如std::begin()和boost::begin()。通过在函数之前使用名称空间可以消除此问题,但如果要这样做,则不需要“使用名称空间std;”。定义使用名称空间std时,没有理由使用std::string。你可以简单地把字符串。我认为在头文件中包含名称空间是一种糟糕的编码实践,因为它可能与后面的其他名称空间发生冲突。例如,如果您在主cpp中包含头,然后决定使用名称空间boost。您的程序将出现函数问题。例如std::begin()和boost::begin()。通过在函数之前使用名称空间可以消除此问题,但如果要这样做,则不需要“使用名称空间std;”。定义使用名称空间std时,没有理由使用std::string。你可以简单地把字符串。我认为在头文件中包含名称空间是一种糟糕的编码实践,因为它可能与后面的其他名称空间发生冲突。例如,如果在主cpp中包含标题,然后决定