C++ 模板类,静态函数编译错误c++;

C++ 模板类,静态函数编译错误c++;,c++,linked-list,C++,Linked List,在我的链表类中定义了以下函数。头文件中的声明如下所示: template <typename T> class RingBuffer { ...//stuff static BLink * NewLink (const T&); // allocator }; 模板 类环形缓冲区 { …//东西 静态闪烁*NewLink(常量T&);//分配器 }; BLink是RingBuffer类中的一个“链接”类。以下实现代码: template <typename

在我的链表类中定义了以下函数。头文件中的声明如下所示:

template <typename T>
class RingBuffer
{
  ...//stuff
  static BLink * NewLink (const T&); // allocator
};
模板
类环形缓冲区
{
…//东西
静态闪烁*NewLink(常量T&);//分配器
};
BLink是RingBuffer类中的一个“链接”类。以下实现代码:

template <typename T>
RingBuffer<T>::BLink * RingBuffer<T>::NewLink( const T& t ) // this is line 114
{
  // create a new link in linked list
  ....
  ....
}
模板
RingBuffer::BLink*RingBuffer::NewLink(常量T&T)//这是第114行
{
//在链接列表中创建新链接
....
....
}
给我这个编译错误:

./ringbuff.cpp:114:错误:在–token之前需要构造函数、析构函数或类型转换


为什么在返回值之前需要预期的构造函数、析构函数或类型转换,我感到困惑。

编译器消息有点误导。 In基本上表示语法/解析错误。
确保原型在编译文件中可见,确保您的环形缓冲区声明为模板。正如其他人所说,检查类声明后的半列。

编译器消息有点误导。 In基本上表示语法/解析错误。
确保原型在编译文件中可见,确保您的环形缓冲区声明为模板。正如其他人所说,检查类声明后的半列。

这里的问题是您引用的是一个嵌套的依赖类型名称(即BLink嵌套在依赖于模板参数的RingBuffer中)

在这种情况下,您需要说明
RingBuffer::BLink
是一个实际的类型名,从而对编译器有所帮助。您可以使用
typename
关键字来实现这一点

template <typename T>
typename RingBuffer<T>::BLink * RingBuffer<T>::NewLink(const T& t)
{
  // ...
}
这可能更好地说明了这个问题,因为它更紧凑。如前所述,解析器不清楚C::const_迭代器是类型名还是静态数据成员,因为它在解析这部分代码时不知道
C
是什么(它可能在稍后的时间点知道模板实际实例化的时间)。因此,为了简化编译器实现者的生活,这种歧义被解决为“不是类型名”如果程序员想要使用嵌套在依赖于模板参数的任何内容中的类型名,他/她必须在名称前面使用
typename
关键字,让编译器知道它应该被视为类型名

不幸的是,当在基类列表或成员初始化列表中的基类标识符中使用嵌套依赖类型名称时,该规则有一个例外

template<typename T>
struct Base {
  struct Nested {
    Nested(int) {}
  };
};

template<typename T>
struct Derived : public Base<T>::Nested { // typename not allowed here
  Derived(int i)
    : Base<T>::Nested(i) // nor here
  {}
};
模板
结构基{
嵌套结构{
嵌套(int){}
};
};
模板
结构派生:公共基::此处不允许嵌套{//typename
派生(int i)
:Base::Nested(i)//此处为nor
{}
};

顺便说一句:您应该将控制台客户端的字符集设置为UTF-8,这样您得到的是
'*'
,而不是

这里的问题是您引用的是一个嵌套的依赖类型名称(即BLink嵌套在依赖于模板参数的RingBuffer中)

在这种情况下,您需要说明
RingBuffer::BLink
是一个实际的类型名,从而对编译器有所帮助。您可以使用
typename
关键字来实现这一点

template <typename T>
typename RingBuffer<T>::BLink * RingBuffer<T>::NewLink(const T& t)
{
  // ...
}
这可能更好地说明了这个问题,因为它更紧凑。如前所述,解析器不清楚C::const_迭代器是类型名还是静态数据成员,因为它在解析这部分代码时不知道
C
是什么(它可能在稍后的时间点知道模板实际实例化的时间)。因此,为了简化编译器实现者的生活,这种歧义被解决为“不是类型名”如果程序员想要使用嵌套在依赖于模板参数的任何内容中的类型名,他/她必须在名称前面使用
typename
关键字,让编译器知道它应该被视为类型名

不幸的是,当在基类列表或成员初始化列表中的基类标识符中使用嵌套依赖类型名称时,该规则有一个例外

template<typename T>
struct Base {
  struct Nested {
    Nested(int) {}
  };
};

template<typename T>
struct Derived : public Base<T>::Nested { // typename not allowed here
  Derived(int i)
    : Base<T>::Nested(i) // nor here
  {}
};
模板
结构基{
嵌套结构{
嵌套(int){}
};
};
模板
结构派生:公共基::此处不允许嵌套{//typename
派生(int i)
:Base::Nested(i)//此处为nor
{}
};

顺便说一句:您应该将console客户端的字符集设置为UTF-8,这样您可以得到
'*'
而不是

摘要中没有返回值,并且不清楚哪一行是114。另外,您在
定义后缺少分号。您是否试图在函数或其他作用域内声明模板?(即,您是否缺少上面的右括号?)第114行是“模板”后面的一行不,我不想在函数或其他范围内声明模板。我想要的返回值“BLink*”,是一个指向RingBuffer类的子类的指针。我试图只透露理论上应该与手头的函数相关的代码。你的摘录中没有返回值,也不清楚哪一行是114。另外,您在
定义后缺少分号。您是否试图在函数或其他作用域内声明模板?(即,您是否缺少上面的右括号?)第114行是“模板”后面的一行不,我不想在函数或其他范围内声明模板。我想要的返回值“BLink*”,是指向一个类的指针,该类是RingBuffer类的一个子类。我试图只透露理论上应该与手头的函数相关的代码。