2009-12-29 14 views
0

вектор включен только в один исходный файл. Единственным stl, включенным в заголовочные файлы, является строка. Тем не менее я не могу избавиться от нескольких ошибок определения (пример ниже). Есть идеи?векторные ошибки определения множественного определения

./plugin_dfb.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182: несколько определение `станд :: операторнозначных (станд :: _ Bit_iterator_base Const &, станд :: _ Bit_iterator_base Const &)» ./painter.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182: первый определяется здесь

+0

Все файлы заголовков с помощью «#pragma раз» –

ответ

0

вы пытались с помощью #pragma once?

+1

#pragma сразу бы * не * решить ошибку, связывающую – sellibitze

0

Я думаю, что вы включили вектор только в один файл заголовка, но этот заголовочный файл не имеет блока #define, это приводит к переопределению файла заголовка вектора, включенного в него. Вставьте прилагаемый файл в шаблон, указанный ниже, и попробуйте.

#if !defined(HEADER_FILE) 
#define HEADER_FILE 
// Your code 
#endif 
+7

обычно идет больше как '#ifndef HEADER_FILE_H',' #define HEADER_FILE_H' и '# endif' в C/C++ –

0

Поскольку проблема возникает при связывании, похоже, она связана с созданием шаблона. Учитывая особенности реализации инстанцирования, функции шаблона/определения должны быть помещены в общие файлы include, чтобы гарантировать, что они видны повсюду, и не дублирует заголовок, что может быть здесь.

От проблемы, которую вы опубликовали, относится к оператору, который может использоваться std :: distance(), который может быть вызван функциями типа find(). Поэтому посмотрите, есть ли у вас такие функции, которые определены или называются так, как они могут работать с векторами и строками, и убедитесь, что они находятся в общих файлах заголовков.

1

Этот std :: operator- это встроенная функция с внешней связью. Похоже, что компоновщик не поддерживает несколько определений таких встроенных функций. Но «одно правило определения» C++ (ODR) явно позволяет это. Обычно такие символы получают «слабую связь» (терминология GNU), но я думаю, что и формат объектного файла, и компоновщик должны поддерживать это.

Я постараюсь задать вопрос в группе/списке рассылки, посвященном вашей платформе. Что-то в строках: «Поддерживает ли платформа X C++ по отношению к связыванию и правилу определения с одним C++ для встроенных функций и шаблонов?».

Возможно, вы также захотите проверить документацию GCC. Возможно, что они предоставляют командный переключатель в качестве рабочего процесса. Если вы еще не используете g ++ как front-end для компоновщика, вы должны попробовать. Может быть, это тоже помогает.

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