2009-10-14 3 views
0

У меня есть два класса с одинаковым именем в разных пространствах имен. Я хочу, чтобы один из этих классов ссылался на другой класс. Причина в том, что я переношу на какой-то новый код, и я хочу обновить старый код, чтобы просто перейти к более новому коду.Как я могу использовать класс с тем же именем из другого пространства имен в моем классе?

Вот супер простой пример:

namespace project { 
namespace legacy { 

class Content { 
public: 
    Content(const string& url) : url_(url) { } 
    string url() { return url_; } 
private: 
    string url_; 
}; 

}} // namespace project::legacy; 

namespace project { 
namespace current { 

class Content { 
public: 
    Content(const string& url) : url_(url) {} 
    string url() { return url_; } 
private: 
    string url_; 

}} // namespace project::current; 

я ожидал, чтобы быть в состоянии сделать следующее project::legacy::Content, но у меня возникли проблемы с некоторыми вопросами компоновщика. Это проблема с тем, как я пытаюсь это сделать, или мне нужно более внимательно изучить мои файлы проекта, чтобы узнать, есть ли у меня какие-то странные проблемы с зависимостью?

#include "project/current/Content.h" 
namespace project { 
namespace legacy { 

class Content { 
public: 
    Content(const string& url) : actualContent_(url) { } 
    string url() { return actualContent_.url(); } 
private: 
    project::current::Content actualContent_; 
}; 

}} // namespace project::legacy; 

Тестовое приложение компилируется нормально, если я пытаюсь ссылаться на экземпляр project::current::Content но если я пытаюсь ссылаться project::current::Content из project::legacy::Content я получаю:

undefined reference to `project::current::Content::Content(...)` 

UPDATE

Как это оказывается, это проблема GNU Autotoolset и не была связана с реальной темой. Спасибо всем за помощь и предложения!

+0

Глупый вопрос: вы включили исходный файл (предположительно новый), содержащий реализацию «project :: current :: Content» на вашем этапе ссылки на проект? –

+1

@Greg Я так думаю?Я использую autotoolset, и иногда сложно определить, что происходит. Однако я могу создать новый экземпляр «project :: current :: Content» в тестовом приложении без проблем. Я получаю эту ошибку компоновщика только в том случае, если я использую класс устаревших, что заставляет меня задаться вопросом, неправильно ли я делаю это одноименное имя. –

+0

@Greg также стоит отметить, что все файлы (тестовое приложение, текущий код и старый код) находятся в одном проекте autotoolset. Я говорю это только так, чтобы было ясно, что устаревший код и текущий код не находятся в отдельных библиотеках. –

ответ

0

Вы пробовали ::project::current::Content (уведомление :: в начале ссылки).

Это похоже на /path/to/file и path/to/file при размещении файла в файловой системе.

+0

Я просто попробовал это. Кажется, это не имело значения. Спасибо за предложение! –

-1

Если исходные файлы имеют одинаковое имя, они будут создавать объектные файлы с тем же именем (по крайней мере, в Visual C++ 2008). Это вызовет проблему, так как один из объектных файлов перезапишет другой, и связь не завершится. Убедитесь, что вы либо переименовываете один из файлов, либо более подходящим образом, переименовываете один из объектных файлов.

Чтобы переименовать один из объектных файлов в Visual C++ 2008, щелкните правой кнопкой мыши на исходном файле и выберите свойства. Перейдите к C/C++ -> Выходные файлы. Измените имя файла объекта из $ (IntDir) \ to $ (IntDir) \ $ (InputName) 1.obj.

Надеюсь, это поможет.

0

У вас есть}; отсутствует в первом примере, в определении проекта/наследия.

В Visual Studio 2008, проект со следующей конфигурацией:

current.h:

#include "stdafx.h" 
#include <string> 
using namespace std; 

namespace project { 
namespace current { 

class Content { 
public: 
    Content(const string& url) : url_(url) {} 
    string url() { return url_; } 
private: 
    string url_; 

}; 
} 
} // namespace project::current; 

namespaces.cpp:

#include "stdafx.h" 
#include <string> 

#include "current.h" 

using namespace std; 

namespace project { 
namespace legacy { 


class Content { 
public: 
    Content(const string& url) : actualContent_(url) { } 
    string url() { return actualContent_.url(); } 
private: 
    project::current::Content actualContent_; 
}; 

} 

} // namespace project::legacy; 



int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
} 

строит без проблем.

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