C++ 类别';不命名类型';模板文件中出现错误
我一直在试图找出编译器中出现错误的原因,在模板文件“Node.template”中声明“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
没有命名类型”
我是新来的类模板,并已四处寻找答案,但我仍然无法解决这个特殊的问题
以下是这两个文件的代码:
//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中包含标题,然后决定