2013-04-13 3 views
2

Это очень любительский вопрос, и я уверен, что это будет очень простой ответ, но я не могу понять проблему. У меня есть заголовочный файл с соответствующим файлом .cpp, но по какой-то причине, когда я пытаюсь компилировать с г ++, я получаю ошибку:Ошибка: декларация ничего не объявляет

declaration does not declare anything

Я уверен, что проблема в том, что я не инициализируя (только) переменную в файле, но я не уверен, для чего ее инициализировать. Если кто-то может помочь, я бы очень признателен! Вот мои файлы:

SymbolTableDictionary.h

#ifndef SymbolTable 
#define SymbolTable 
#include <new> 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string> 

using namespace std; 

#pragma once 

struct Symbol 
{ 
    std::string Name; 
    int Address; 

    Symbol::Symbol() 
    { } 

    Symbol::Symbol(const string name, int address) 
    { 
     std::string sym(name); 
     this->Name = sym; 
     this->Address = address; 
    } 
}; 

extern map<std::string, Symbol> SymbolTable; 

#endif 

SymbolTableDictionary.cpp

#include <new> 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string> 
#include <map> 

#include "SymbolTableDictionary.h" 

using namespace std; 

map<std::string, Symbol> SymbolTable; 

Ошибки компиляции:

In file included from SymbolTableDictionary.cpp:8:0: 
SymbolTableDictionary.h:18:5: error: extra qualification ‘Symbol::’ on member ‘Symbol’ [-fpermissive] 
SymbolTableDictionary.h:21:5: error: extra qualification ‘Symbol::’ on member ‘Symbol’ [-fpermissive] 
SymbolTableDictionary.h:29:8: error: declaration does not declare anything [-fpermissive] 
SymbolTableDictionary.cpp:12:1: error: declaration does not declare anything [-fpermissive] 
+2

Вы должны избегать '' и '' в большинстве программ на С ++, не говоря уже о '' и' '. Кроме того, обычно считается, что не рекомендуется использовать 'using namespace std;', и считается невоспитанным, чтобы добавить его в заголовок. Это поможет, если вы определили строку, в которой компилятор сообщает об этой проблеме. –

+0

Я предлагаю использовать защитники заголовков с некоторыми вариациями на тему '#ifndef SYMBOLTABLEDICTIONARY_H_INCLUDED' (все кепки, основанные на имени файла, маловероятны для использования в других целях). Еще одно разумное предложение - использовать имя, основанное на хеше MD5 содержимого некоторой версии файла: '#ifndef H_779f06b8e4323b7991ddfd9078d79923', возможно. –

+0

Тот факт, что заголовок заголовка и имя переменной были одинаковыми, вызвали эту проблему. Не могу поверить, что раньше этого не видел. Спасибо всем за помощь! Очень признателен! –

ответ

9

Проблема этот код:

// header 
#ifndef SymbolTable 
#define SymbolTable 

// implementation 
map<std::string, Symbol> SymbolTable; 

Вы #define SymbolTable пустым. Поэтому советуют

  1. Всегда используйте ALL_UPPERCASE_NAMES для макросов (также включают охрану)

  2. Используйте макроимена только для макросов.

+0

+1: Хорошо заметили! –

+0

Ничего себе, я не могу поверить, что я этого не замечал! Вот так! Спасибо огромное! –

3

Название вашей карты SymbolTable является таким же, как макрос используется в включает охраннику

#ifndef SymbolTable 
#define SymbolTable 

Поскольку этот макрос пуст ваше объявление выглядит следующим образом

map<std::string, Symbol> ; //note: no name 

Решение заключается в используйте более уродливое имя макроса для включения охраны, например:

#ifndef SYMBOL_TABLE_H 
#define SYMBOL_TABLE_H 
+0

+1: Хорошо заметили! –

3

Вместо

#infndef SymbolTable 
#define SymbolTable 
.. 
#endif 

Вы могли бы просто использовать

#pragma once 

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

+0

'#pragma once' работает с Visual Studio, но не с g ++. –

+1

@VasilyBiryukov Да, это так ... Какую версию вы используете? Как вы компилируете? Я использую '#prgama once' для всего моего кода, не имел никаких проблем с ним, используя g ++ – olevegard

+0

Вы правы, g ++ [поддерживает] (http://gcc.gnu.org/onlinedocs/gcc-4.4.0/ cpp/Alternatives-to-Wrapper-_0023ifndef.html) '#prama once'. Я пропустил это. +1 к вам. –

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