2014-03-24 5 views
0

Я знаю, что есть еще несколько вопросов по этому конкретному вопросу, но ничего, что я могу найти на нем, похоже, работает, поэтому я отправляю свой код ,Ошибка: переменная '*' имеет инициализатор, но неполный тип и еще один

Вот код:

#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__ 

Я получаю: variable 'cige::memory::CIGE_API cige::memory::MemoryTracker' has initializer but incomplete type в соответствии с объявлением класса. Я просмотрел все, и я не могу найти ответы, которые исправили эту проблему.

У меня также есть ошибка expected '}' or ',' or ';' before 'protected' на линии с защитой, прямо над структурой.

Любая помощь с любой из этих двух ошибок будет оценена по достоинству.

EDIT: CIGE_API определен в отдельном файле (который включен), как __declspec(dllexport).

EDIT2: Я исправил свою проблему (см. Ответ ниже). В основном это был код Code :: Blocks, который был довольно плохим.

+1

Боковое замечание: ваши идентификаторы защитника включены в C++, поскольку имена, начинающиеся с подчеркивания, или одно подчеркивание, за которым следует заглавная буква, зарезервированы для исполнителей библиотеки компилятора/стандартной библиотеки. Кроме того, 'typedef struct' не имеет смысла в C++. И в-третьих, как определяется CIGE_API? Согласно сообщению об ошибке, его определение, вероятно, отсутствует. –

+0

Я использую Code :: Blocks, и я включил отдельный файл с набором стандартов, используя параметр C :: B, чтобы глобально включать файлы. CIGE_API определяется как __declspec (dllexport). – sm81095

+0

Кроме того, @KonradRudolph, те, которые включают в себя охранники, абсолютно верны, так как у меня никогда не было проблем с ними раньше, во многих проектах, которые я использовал как с MSVC, так и с MinGW. Его также то же самое касается охранников, которые использует Ogre Engine, и у них, похоже, никогда не было никаких проблем с ним. – sm81095

ответ

1

Похоже, что CIGE_API не определен. Поэтому компилятор попытается разрешить его как объявление переменной class Type Variable {initializer-list}, где Type - CIGE_API и Variable - MemoryTracker.

Иными словами, синтаксически вы создаете тип CIGE_API и создаете переменную этого типа вместо определения класса.

1

Определение

class CIGE_API MemoryTracker { ... }; 

не действует C++. Я думаю, CIGE_API - это макрос, определенный для конкретного расширения для реализации, но вы не включили соответствующий заголовок, который определяет этот макрос.

0

ОК Я закончил тем, что исправил свою проблему. Code :: Blocks неправильно находил файлы, которые были в моем проекте (примерно в третий раз это произошло).

В абсолютно несвязанных новостях кто-нибудь знает другую кросс-платформенную среду IDE, которая хорошо работает для C++? (Я уже знаю об Eclipse).

+0

Я рекомендую QtCreator – fritzone

+0

g ++ с помощью vim;) – dylnmc

Смежные вопросы