2010-08-22 3 views
3

У меня есть что-то вроде этого в моем коде:Странные Несколько Определения ошибок

namespace A { 
namespace B { 

void 
GetLine(std::istream& stream, std::string& line) 
{ 
    line.clear(); 
    while (stream.good()) { 
     std::getline(stream, line); 
     boost::trim(line); 
     if (not line.empty()) break; 
    } 
    boost::to_upper(line); 
} 

} 
} 

И я получаю ошибку несколько определений всякий раз, когда я называю A::B::GetLine. Любые идеи, почему?

(Код работает, поэтому я постараюсь дать конкретные фрагменты, если вам нужна дополнительная информация, но я не могу просто поместить весь код здесь).

+0

Не можете ли вы опубликовать сообщение об ошибке компилятора? Возможно, это намекает нам на что-то другое, чего нет в приведенном выше фрагменте. – David

+2

Вы пытаетесь связать в объектном файле несколько раз? Взгляните на свой файл makefile, чтобы узнать, передается ли .o, содержащее эту функцию, в компилятор несколько раз. Я предполагаю, что вы используете Unix или Unix-подобную систему, но еще одна вещь, которую вы можете сделать, - запустить «nm --demangle» во всех ваших объектных файлах и выполнить поиск A :: B :: GetLine, чтобы увидеть, отображается как «определенное» в нескольких файлах .o. – George

+0

+1 для nm --demangle – Chubsdad

ответ

4

Вы почти наверняка включили код в несколько заголовков, вместо объявления в заголовке и определения в исходном файле. Вам нужно объявить функцию inline, шаблон или переместить определение в исходный файл, но оставить объявление в заголовке.

+0

Так просто ... Спасибо! –

1

Ваша проблема заключается в том, что вы, вероятно, имеете этот код в файле .h и включаете его в более .cpp-файлы. Решение состоит в том, чтобы использовать встроенное ключевое слово, чтобы компилятор встраивать его и удалить ссылку:

namespace A { 
namespace B { 

inline void 
GetLine(std::istream& stream, std::string& line) 
{ 
    line.clear(); 
    while (stream.good()) { 
     std::getline(stream, line); 
     boost::trim(line); 
     if (not line.empty()) break; 
    } 
    boost::to_upper(line); 
} 

} 
} 

Другим решением является перемещение тела метода в файл .cpp.

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