2012-06-16 2 views
2

Я пытаюсь объявить объект из класса в другом файле. Я добавил #include "transfer.h" в мой metadata.cpp файл, но я получаю следующее сообщение об ошибке:C++ constructor undefined reference

metadata.o: In function `importMetadata': 
metadata.cpp:(.text+0x81): undefined reference to A::B::C::Transfer::Transfer()' 
metadata.cpp:(.text+0x81): undefined reference to A::B::C::Transfer::~Transfer()' 

И передачи определяется с в transfer.h

namespace A{ 
    namespace B{ 
    namespace C{ 
     class Transfer { 
      public: 
       Transfer(); 
       ~Transfer(); 
       int copydata(); 
      ... more code goes here. 
     }; 
    } 
    } 
} 

Файл transfer.cpp выглядит следующим образом:

Transfer::Transfer(){ 
} 
Transfer::~Transfer(){ 
} 

Я также делаю using namespace A::B::C; в заголовке файла metadata.cpp. Может кто-нибудь, пожалуйста, помогите мне в этом? В функции int importMetadata() в metadata.cpp я объявляю Transfer transfer; так в metadata.cpp я делаю «transfer.copydata();`

+1

Пожалуйста, покажите нам полный пример, который воспроизводит вашу ошибку. – robert

+3

Редко бывает, что нужно много вложенных пространств имен и практически никогда не имеет случая использовать «пространство имен» ... – AJG85

+0

Определяется ли 'Transfer' конструктор по умолчанию? Ошибка просто говорит вам, что компоновщик не смог найти реализацию 'Transfer()'. –

ответ

1

Надеюсь, вы оставили из части файла transfer.cpp, но в случае если вы не должна определить пространство имен, чтобы соответствовать файл заголовка, как, например:

namespace A{ 
    namespace B{ 
    namespace C{ 
     Transfer::Transfer(){ 
     } 
     Transfer::~Transfer(){ 
     } 
    } 
    } 
} 

В случае, если вы были полностью определен пространства имен, как встроенные, так и выше, вы должны убедиться, что у вас есть файл transfer.cpp, включенный в ваш проект. Похоже, что компоновщик не может найти ваш исходный файл.

+0

Если он неправильно определил пространства имен, это даст ошибку компилятора, а не ошибку компоновщика, я думаю. – Fraser

+0

@Fraser: Я тоже об этом думал, но компилятор скомпилирует два класса с одинаковым именем в разных пространствах имен. – MrWuf

2

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

Вероятно, у вас есть transfer.cpp, чтобы идти вместе с transfer.h, и в этом файле отсутствует реализация конструктора переноса и деструктора. Это может быть связано с тем, что функции вообще отсутствуют или были случайно определены с другой подписью.

Так transfer.cpp должно выглядеть примерно так:

A::B::C::Transfer::Transfer() 
{ 
} 

A::B::C::Transfer::~Transfer() 
{ 
} 

Другая возможность заключается в том, что вы пытаетесь связать деле ввода перевода из библиотеки. В этом случае вам нужно будет указать вашему компоновщику использовать файл .lib в качестве входных данных. Синтаксис для этого будет зависеть от используемого вами компилятора.

+0

Если функции были случайно определены с другой сигнатурой, это привело бы к ошибке компилятора, а не к ошибке компоновщика, не так ли? +1 для предложения недостающей библиотеки. Другой вариант заключается в том, что transfer.cpp существует, но не компилируется в цель. – Fraser

+0

@Fraser прав, если вы определили что-то вроде Transfer (int), тогда компиляция transfer.cpp ошибочно заявила бы, что она не определена. Я подумал, что это полезное предложение, так как мы не знаем, что внутри «... больше кода идет здесь», а также независимо от того, ограничивается ли весь вывод ошибок тем, что было представлено в вопросе или нет. – kennbrodhagen