【问题标题】:"incomplete type" error when accessing a template class访问模板类时出现“不完整类型”错误
【发布时间】:2014-11-22 09:22:58
【问题描述】:

我有一个包含“Buffer”模板类的“SignalProcessingBlock”类。 它们是这样的:

SignalProcessingBlock.h:

class SignalProcessingBlock{

public:

Buffer <class BufferClass>  *InputBuffer;

Buffer <class BufferClass>  *OutputBuffer;

SignalProcessingBlock   *FrontSignalProcessingBlock;

    void Process();
};

SignalProcessingBlock.cpp:
#include "SignalProcessingBlock.h"
void SignalProcessingBlock::Process()

{
    double tmp;

    for (int i=0;i<(this->InputBuffer->BufferSize/2);i++)

    {

        this->OutputBuffer->buffer[i] = this->InputBuffer->buffer[i*2];

        tmp=this->OutputBuffer->buffer[i];

    }

}

Buffer.h:

template <class BufferClass> class Buffer
{
public:

int         BufferSize;

BufferClass buffer[];

Buffer (BufferClass *buffer,int BufferSize);
};

Buffer.cpp:
#include "Buffer.h"

template <class BufferClass> 

Buffer <BufferClass>::Buffer(BufferClass *buffer,int BufferSize)
{

this->buffer=buffer;

this->BufferSize=BufferSize;
}

即使在我尝试执行我需要的操作之前,我也会收到以下错误行:

jni/SignalProcessingBlock.cpp:34:47: error: definition of implicitly-declared 'SignalProcessingBlock::~SignalProcessingBlock()'
In file included from jni/SignalProcessingBlock.h:4:0,
                 from jni/SignalProcessingBlock.cpp:1:
jni/Buffer.h: In instantiation of 'Buffer<BufferClass>':
jni/SignalProcessingBlock.cpp:42:35:   instantiated from here
jni/Buffer.h:9:21: error: 'Buffer<BufferClass>::buffer' has incomplete type
jni/SignalProcessingBlock.h:11:16: error: forward declaration of 'struct BufferClass'
jni/SignalProcessingBlock.cpp: In member function 'void SignalProcessingBlock::Process()':
jni/SignalProcessingBlock.cpp:44:23: error: 'class Buffer<BufferClass>' has no member named 'buffer'
jni/SignalProcessingBlock.cpp:44:54: error: 'class Buffer<BufferClass>' has no member named 'buffer'
jni/SignalProcessingBlock.cpp:45:27: error: 'class Buffer<BufferClass>' has no member named 'buffer'
/cygdrive/d/Development/NDK/android-ndk-r9/build/core/build-binary.mk:348: recipe for target 'obj/local/armeabi-v7a/objs-debug/com_talkitt_beta_NativeWrapper/SignalProcessingBlock.o' failed
make: *** [obj/local/armeabi-v7a/objs-debug/com_talkitt_beta_NativeWrapper/SignalProcessingBlock.o] Error 1

我用 C++ 编写并使用 eclipse Juno,调试和构建是使用 ndk-build(“make”命令包装器)执行的。

我按照书本做所有事情并且不理解错误,我确实有“缓冲区”成员并且语法似乎是正确的。

非常感谢您的帮助!

顺便说一句,堆栈溢出告诉我出于某种原因我需要添加更多信息,所以我只是在写东西

【问题讨论】:

  • Buffer 定义在哪里(您是否缺少包含)?
  • @SleuthEye 请向下滚动查看Buffer的定义

标签: android c++ android-ndk java-native-interface incomplete-type


【解决方案1】:

在模板类Buffer的定义中,标记BufferClass是模板的参数。稍后在声明要使用的 Buffer 对象的类型时,您需要专门化模板,或者换句话说,指定要用作模板参数的实际类型。

在您的特定情况下,如果您需要一个包含 double 值数组的 Buffer 实例,您可以执行以下操作:

#include "Buffer.h"
class SignalProcessingBlock{

public:
  Buffer <double>  *InputBuffer;
  ...

另一方面,如果您希望推迟模板特化,则必须将 SignalProcessingBlock 也设为模板类:

#include "Buffer.h"
template <class BufferClass> class SignalProcessingBlock{

public:
  Buffer <typename BufferClass>  *InputBuffer;
  ...

【讨论】:

  • 是的,但是在我创建实例之前,在编译中我有一个错误(正如我在原始帖子中所写的那样)..
  • @user3378878 您需要为要实例化的对象指定完整类型,即具有特定类型的专用模板(如我的代码示例中所示,我将 class BufferClass 替换为 @ 987654330@ 声明InputBuffer 的类型时)。希望这可以澄清它。
  • @user3378878 我不想要一个特定的类型 - 我想要一个通用的缓冲区,这些输入可以是 int、double、float、bool 或其他,现在没有函数可以将根据它们的类型以不同的方式实现。你给我看的是模板专业化,我现在不想要它..
  • @user3378878 就映射到机器代码而言,对不同类型缓冲区的操作本质上是不同的(例如,分配双精度必须复制 8 个字节,而分配整数通常复制 4 个字节) .但是,您可以通过使 SignalProcessingBlock 也成为模板类来推迟模板专业化。
  • 这是一个很好的观点,但我已经尝试过了.. 问题是我需要 SignalProcessingBlock 以后也是虚拟的,而 C++ 不包括虚拟模板类......
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多