Неопределенная ссылка на функцию, не являющуюся членом - C ++ - PullRequest
6 голосов
/ 17 января 2010

У меня есть следующее в заголовочном файле.

namespace silc{
   class pattern_token_map
   {
      /* Contents */
   };

   pattern_token_map* load_from_file(const char*);
}

В файле CPP (это правильно включает в себя)

pattern_token_map* load_from_file(const char* filename)
{
   // Implementation goes here
}

В другом файле CPP. Это включает в себя все необходимые.

void some_method()
{
    const char* filename = "sample.xml";
    pattern_token_map* map = load_from_file( filename ); // Linker complains about this.
}

Я получаю ошибку компоновщика, говорящую, что неопределенная ссылка на load_from_file. Я не могу видеть, что здесь происходит не так.

Любая помощь будет оценена.

Компилятор: G ++ ОС: Ubuntu 9.10

Редактировать

Здесь используется команда компоновщика.

g++ -L/home/nkn/silc-project/third_party/UnitTest++ -o tests.out  src/phonetic_kit/pattern_token_map.o  tests/pattern_token_map_tests.o  tests/main.o -lUnitTest++

Ошибка от pattern_token_map_tests.o, а функция доступна в pattern_token_map.o. Так что я думаю, что порядок ссылок не создает проблемы. (Я удалил некоторые файлы из команды, чтобы упростить это)

Ответы [ 2 ]

9 голосов
/ 17 января 2010

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

namespace silc {
pattern_token_map* load_from_file(const char* filename) {
   // Implementation goes here
}
}

Если вы вместо этого сделали это:

using namespace silc; // to get pattern_token_map
pattern_token_map* load_from_file(const char* filename) {
   // Implementation goes here
}

Тогда вы будете определять новую функцию , а не silc :: load_from_file.

Избегайте использования директив («используя пространство имен ...;») вне области действия функции, как общее указание:

using namespace silc; // outside function scope: avoid

silc::pattern_token_map*                      // qualify return type
random_function(silc::pattern_token_map* p) { // and parameters
  using namespace silc; // inside function scope: fine
  pattern_token_map* p2 = 0; // don't have to qualify inside the function
                             // if you want to use the using directive
  silc::pattern_token_map* p3 = 0; // but you can always do this
  return 0;
}
0 голосов
/ 17 января 2010

На этапе компоновки вы создаете ссылку в объектном файле, созданном путем компиляции первого файла cpp?Подобные ошибки компоновщика возникают, когда один объект ссылается на символ, который не включен в связанные объекты.

Редактировать: Я все еще достаточно уверен, что это проблема.В первом файле есть символ препроцессора, переопределяющий load_from_file?

...