C++ 模板化C++;类在重新编译时意外不可访问
我有一个类实现了一个模板化的缓冲区结构,我在我的代码中使用它C++ 模板化C++;类在重新编译时意外不可访问,c++,xcode,C++,Xcode,我有一个类实现了一个模板化的缓冲区结构,我在我的代码中使用它 template <typename T> class CBuf { public: unsigned int TotItems; unsigned int buflen; CBuf (unsigned int len); ~CBuf (); void clear (); void fillWithZeroes (); bool addFrame (T *frame
template <typename T> class CBuf
{
public:
unsigned int TotItems;
unsigned int buflen;
CBuf (unsigned int len);
~CBuf ();
void clear ();
void fillWithZeroes ();
bool addFrame (T *frame, unsigned int fs);
int getFrame (T *frame, unsigned int fs);
int peekFrame (T *frame, unsigned int fs);
int copyOut (T *pBuf, unsigned int len);
void copyIn (T *pBuf, unsigned int len);
void copy ( CBuf<T> &other );
private:
HeapBlock<T> buffer;
unsigned int addpos, getpos;
};
模板类CBuf
{
公众:
无符号整数项;
无符号整数buflen;
CBuf(无符号整数len);
~CBuf();
无效清除();
用零填充空格();
bool addFrame(T*frame,无符号整数fs);
int-getFrame(T*frame,无符号int-fs);
整数帧(T*帧,无符号整数fs);
整数复制输出(T*pBuf,无符号整数长度);
无效复制(T*pBuf,无符号整数长度);
无效副本(CBuf和其他);
私人:
堆块缓冲区;
无符号整数addpos,getpos;
};
这在我的代码的各个部分中使用,没有任何问题,并且已经工作了很多年
该对象由另一个缓冲区继承,如下所示:
class FrameBuffer : public CBuf<unsigned char>
{
private:
int numFrames;
public:
/** error codes that may be returned */
enum errors {
OK, /*!< OK */
BUFFERFULL, /*!< the action has failed becuase it would cause a buffer overflow */
NODATA, /*!< the action has failed because there is insufficient data */
TOOSMALL /*!< the supplied buffer is too small to receive the frame */
};
/**
类帧缓冲区:公共CBuf
{
私人:
int numFrames;
公众:
/**可能返回的错误代码*/
枚举错误{
好的,/*!<好的*/
BUFFERFULL,/*!<该操作已失败,因为它将导致缓冲区溢出*/
NODATA,/*!<由于数据不足,操作失败*/
Toosall/*!<提供的缓冲区太小,无法接收帧*/
};
/**
同样,这也很好。昨天我在删除所有生成的文件后对代码进行了完整的重新编译。突然,以下代码:
class SoundBuffer : public JitterBuffer
{
private:
CBuf<float> historyBuffer; // maintain a running history
class SoundBuffer:公共JitterBuffer
{
私人:
CBuf historyBuffer;//维护运行历史记录
产生
CBuf is a private member of CBuf<unsigned char>
CBuf是CBuf的私人会员
这个限制可以追溯到FrameBuffer的定义。JitterBuffer继承了FrameBuffer类,并将FrameBuffer.h文件包含在它自己的include中。这是FrameBuffer和CBuf一起使用的唯一地方,也是产生错误的唯一地方。我已经尝试了所有方法,但无法修复错误-这是一个错误l编译到昨天还不错。修改JitterBuffer以不同方式继承是可能的,但在一段复杂的代码中需要大量的工作,这段代码运行良好,很难测试。对此有何想法?“JitterBuffer继承FrameBuffer类”:此继承是私有的吗?请尝试使用
::CBuf
而不是CBuf
,以避免通过非限定名称查找找到私有注入的类名。谢谢。它解决了编译问题,但随后我收到一个链接错误,表示未找到任何CBuf方法符号。如果通过移动所有类代码找到解决方法,我将但显然这不是正确的解决方案模板的成员函数通常必须在头文件中实现,这是正确的。(有使用显式实例化的替代方法,但它们的用途有限。)如果你在你的问题中添加我所要求的缺失信息,那么我可以写一个解释问题的答案。特别是GCC和Clang在这种情况下有不同的行为,因此如果完整的话,这将是一个有趣的问题。如果有一个适当的继承,它会更好。嗨-我已经尝试了私有和公有继承,结果相同目前正在使用clang编译器。稍后我将给出一个最小的可复制示例。“JitterBuffer继承FrameBuffer类”:此继承是私有的吗?请尝试使用::CBuf
而不是CBuf
,以避免通过非限定名称查找找到私有注入的类名。谢谢。它解决了编译问题,但随后我收到一个链接错误,表示未找到任何CBuf方法符号。如果通过移动所有类代码找到解决方法,我将但显然这不是正确的解决方案模板的成员函数通常必须在头文件中实现,这是正确的。(有使用显式实例化的替代方法,但它们的用途有限。)如果你在你的问题中添加我所要求的缺失信息,那么我可以写一个解释问题的答案。特别是GCC和Clang在这种情况下有不同的行为,因此如果完整的话,这将是一个有趣的问题。如果有一个适当的继承,它会更好。嗨-我已经尝试了私有和公有继承,结果相同目前正在使用clang编译器。稍后我将提供一个最小的可复制示例。