【问题标题】:Syntax for constructor in template class模板类中构造函数的语法
【发布时间】:2012-06-11 22:42:22
【问题描述】:

我正在尝试创建一个通用的循环缓冲区模板,但有一些我无法理解的语法错误。错误出现在我的构造函数中,尽管我似乎已经以相同的方式参数化了析构函数并且那个方法有效。我遵循了 Stroustrup C++ 中的示例,他在范围解析运算符之前以及函数名称中使用了一个参数,就像我一样。我也确定没有循环依赖,因为我只编译一个文件。此外,实现和声明在同一个文件 (CircBuf.h) 中,并且没有对应的 .cpp 文件,因此链接也不应该成为问题。我尝试按照this 解决方案添加“inline”关键字,但我得到了同样的错误。

/* CircBuf.h */
template<typename T> class CircBuf {
  // don't use default ctor                                                                                                                                               
  CircBuf();

  int size;
  T *data;
public:
  CircBuf(int);
  ~CircBuf();
};

template<typename T> CircBuff<T>::CircBuf<T>(int i) {
  data = new T[i];
}
template<typename T> CircBuf<T>::~CircBuf<T>() {
  delete data;
}

制作文件

all:
        g++ -g -pedantic CircBuf.h -o prog

编译错误

CircBuf.h:13:22: error: ‘CircBuff’ does not name a type

【问题讨论】:

  • 您在一个实例中写了CircBuff 而不是CircBuf。这就是编译器试图告诉你的。

标签: c++ templates compiler-errors


【解决方案1】:

CircBuff 当然没有命名类型,你想要的类型的名称是 CircBuf 和一个 f

请注意,您还需要在构造函数和析构函数中丢失尾随 &lt;T&gt;

【讨论】:

  • CircBuf.h:15:22: error: 'CircBuf::CircBuf' 命名构造函数,而不是类型 CircBuf.h:15:22: error: 和 'CircBuf ' 没有模板构造函数
  • 我像这样从函数名中删除了参数并且它可以工作:template CircBuf::CircBuf(int i)
  • @xst: 构造函数名称处的参数在构造函数也是模板时使用。
  • @xst:这是模板类template&lt;typename T&gt; CircBuf&lt;T&gt;::CircBuf(int i)的常规构造函数;这是模板类template&lt;typename T&gt; template&lt;typename U&gt; CircBuf&lt;T&gt;::CircBuf&lt;U&gt;(U i)的模板构造函数。
  • 好的,谢谢。顺便说一句,您是如何在评论中标记代码的。我也尝试使用@username,但不会出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 2011-05-08
相关资源
最近更新 更多