C++ 错误:变量'*';具有初始值设定项,但类型不完整

C++ 错误:变量'*';具有初始值设定项,但类型不完整,c++,class,struct,compiler-errors,C++,Class,Struct,Compiler Errors,我知道在这个特定的问题上还有一些其他的问题,但是我在上面找不到任何有用的东西,所以我发布了我的特定代码 代码如下: #ifndef __MEMORY_TRACKER_H__ #define __MEMORY_TRACKER_H__ #include <unordered_map> namespace cige { namespace memory { class CIGE_API MemoryTracker { protected: typedef struct AllocRec

我知道在这个特定的问题上还有一些其他的问题,但是我在上面找不到任何有用的东西,所以我发布了我的特定代码

代码如下:

#ifndef __MEMORY_TRACKER_H__
#define __MEMORY_TRACKER_H__

#include <unordered_map>

namespace cige
{
namespace memory
{
class CIGE_API MemoryTracker
{
protected:
typedef struct AllocRecord
{
    size_t bytes;
    std::string filename;
    size_t line;
    std::string func;

    AllocRecord() :
        bytes(0), line(0)
    { }
    AllocRecord(size_t sz, const char* file, size_t ln, const char* fun) :
        bytes(sz), line(ln)
    {
        if (file)
            filename = file;
        if (fun)
            func = fun;
    }
} AllocRecord;

std::string m_leakFileName;
bool m_dumpToConsole;
typedef std::unordered_map<void*, AllocRecord> AllocMap;
AllocMap m_allocationMap;

size_t m_totalAllocations;
bool m_recordEnable;

protected:
void reportLeaks();

MemoryTracker() :
    m_leakFileName("CIGEMemory.log"), m_dumpToConsole(true), m_totalAllocations(0), m_recordEnable(true)
{ }

public:
void setReportFileName(const std::string& name)
{
    m_leakFileName = name;
}
const std::string& getReportFileName() const
{
    return m_leakFileName;
}
void setReportToConsoleOutput(bool b)
{
    m_dumpToConsole = b;
}
bool getReportToConsoleOutput() const
{
    return m_dumpToConsole;
}
void setRecordEnable(bool b)
{
    m_recordEnable = b;
}
bool getRecordEnable() const
{
    return m_recordEnable;
}

size_t getTotalMemoryAllocated() const
{
    return m_totalAllocations;
}

void _recordAlloc(void* ptr, size_t sz, const char* file = nullptr, size_t ln = 0, const char* fun = nullptr);
void _recordDealloc(void* ptr);

~MemoryTracker()
{
    reportLeaks();
}

static MemoryTracker& get();
};
}
}

#endif // __MEMORY_TRACKER_H__
#ifndef(内存)跟踪器(H)__
#定义内存跟踪器__
#包括
名称空间cige
{
名称空间内存
{
类CIGE_API内存跟踪程序
{
受保护的:
类型定义结构AllocRecord
{
字节大小;
std::字符串文件名;
尺寸线;
std::string func;
AllocRecord():
字节(0),行(0)
{ }
AllocRecord(大小sz,常量字符*文件,大小ln,常量字符*乐趣):
字节(sz),行(ln)
{
如果(文件)
文件名=文件;
如果(有趣)
func=乐趣;
}
}异位记录;
std::字符串m_leakFileName;
bool m_dumpToConsole;
typedef std::无序映射AllocMap;
AllocMap m_分配映射;
总分配的大小;
bool m_recordEnable;
受保护的:
void reportLeaks();
MemoryTracker():
m_leakFileName(“CIGEMemory.log”)、m_dumpToConsole(true)、m_totalAllocations(0)、m_recordEnable(true)
{ }
公众:
void setReportFileName(const std::string和name)
{
m_leakFileName=名称;
}
常量std::string&getReportFileName()常量
{
返回m_文件名;
}
无效setReportToConsoleOutput(布尔b)
{
m_dumpToConsole=b;
}
bool getReportToConsoleOutput()常量
{
返回m_dumpToConsole;
}
作废setRecordEnable(布尔b)
{
m_recordEnable=b;
}
bool getRecordEnable()常量
{
返回m_recordEnable;
}
大小\u t getTotalMemoryAllocated()常量
{
返回m_totalAllocations;
}
void _recordAlloc(void*ptr,size\u t sz,const char*file=nullptr,size\u t ln=0,const char*fun=nullptr);
void _recordDealloc(void*ptr);
~MemoryTracker()
{
报告泄漏();
}
静态内存跟踪程序&get();
};
}
}
#endif/\内存\跟踪器\u H__
我得到:
变量'cige::memory::cige_API cige::memory::MemoryTracker'在类声明行有初始值设定项,但类型不完整。我找遍了所有地方,找不到任何解决这个问题的答案

我还遇到了错误
应为'}'或''or';'在“protected”之前
在结构正上方带有protected的行中

如果您对这两个错误有任何帮助,我们将不胜感激

编辑:CIGE_API在单独的文件(包括)中定义为
\uu declspec(dllexport)


编辑2:我解决了我的问题(见下面的答案)。它基本上只是代码::块的删除非常糟糕。

看起来好像没有定义CIGE\u API。所以编译器尝试像变量声明
类类型变量{initializer list}
一样解析它,其中
类型
CIGE_API
变量
内存追踪程序

换句话说,从语法上讲,您预先声明了
CIGE_API
类型,并创建了此类型的变量,而不是定义一个类。

定义

class CIGE_API MemoryTracker { ... };

不是C++。我猜

CIGE\u API
是为特定于实现的扩展定义的宏,但您没有包含定义该宏的相应头。

好的,我最终解决了自己的问题。代码::Blocks没有正确查找项目中的文件(大约是第三次)


在完全无关的新闻中,有人知道C++的另一个跨平台IDE吗?(我已经知道了Eclipse).< /P>侧方注释:您的包含的保护名在C++中是无效的,因为从下划线开始的名称,或者一个下划线,后面是一个大写字母,都是为编译器/标准库的实现者预留的。另外, TyPufStrut在C++中没有意义。第三,CIGE_API是如何定义的?根据错误消息,它的定义可能丢失了。我使用的是Code::Blocks,我包含了一个单独的文件,其中包含了一组标准定义,使用C::B的设置全局包含文件。CIGE_API被定义为u declspec(dllexport)。此外,@KonradRudolph,这些包含防护的API是完全有效的,因为在我与MSVC和MinGW一起使用的许多项目中,我从来没有遇到过任何问题。它同样包括食人魔引擎使用的守卫,而且他们似乎也从来没有遇到过任何问题。他们肯定是无效的。仅仅因为你还没有遇到问题并不意味着什么。仅仅因为有其他代码,这并不意味着它没有错。我推荐QtCreator