2013-06-12 9 views
0

В файле с именем types.h, я определилC2011: «структура» типа переопределение и C2027: использование неопределенного типа

struct entry { 
    entry(int a, int t) : addr(a), time(t) {} 
    int addr; 
    int time; 
}; 

В другом файле я хочу использовать-структуру, как это в compress.h:

#include "types.h" 
#include <vector> 
class Compress { 
public: 
    void insert(int a, int t) 
    { 
    theVec.clear(); 
    for (int i = 0; i < 10; ++i) 
     theVec.push_back(entry(a, t)); 
    } 

private: 
    std::vector<entry> theVec; 
}; 

В главном файле, я написал

#include "compress.h" 
int main() 
{ 
    Compress *com = new Compress; 
    com->insert(10, 100); 
    return 0; 
} 

Однако на линии push_back, я получаю эти заблуждаться ors

error C2011: 'entry' : 'struct' type redefinition 
see declaration of 'entry' 
error C2027: use of undefined type 'entry' 
see declaration of 'entry' 

Как это исправить?

+3

вы иметь заголовок охранников в своем заголовке? –

+3

Можете ли вы опубликовать [минимальный, полный пример] (http://sscce.org/)? – Angew

+0

@ Ivaylo Strandjev: Я отредактировал сообщение и включил заголовки. – mahmood

ответ

3

В файле types.h вы должны иметь что-то вроде этого:

#ifndef TYPES_H 
#define TYPES_H 

struct ... 

#endif 

Это позволит предотвратить компилятор от разбора инклюднике Mulitple раз, если вы включите его больше, чем когда-то, что могло бы привести несколько определений.

Само название не имеет значения, но вы должны убедиться, что оно уникально и не определено каким-либо другим включенным файлом.

2

Возможно, вы захотите проверить защитный кожух типов.h.

Попытка иметь файл начать с линией

#pragma once 

// your declarations 
+0

Это нестандартное: https://en.wikipedia.org/wiki/Pragma_once – legends2k

+2

Да, это так. И все же он предлагает преимущества для традиционного охранника. Многие широко распространенные компиляторы, такие как MSVC и GCC, прекрасно понимают это, он имеет гораздо меньший отпечаток, более самоописательный и, как говорят, обеспечивает лучшую производительность в крупных проектах MSVC, потому что Visual Studio фактически не будет касаться файла дважды, тогда как традиционный охранник всегда оценивается. Результат в некоторых случаях быстрее на 10% быстрее. И поскольку OP использует Visual Studio, это не причинит ему никакого вреда. –

+0

Но «pragma once» может также вызвать проблемы - по крайней мере, в Linux я видел проблемы, когда заголовок доступен в двух местах (например, через символическую ссылку или что-то еще). GCC не распознает это и дважды включает заголовок. – duselbaer

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