Как я могу использовать класс с таким же именем из другого пространства имен в своем классе?

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

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

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(...)`

ОБНОВЛЕНИЕ

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


person Community    schedule 14.10.2009    source источник
comment
Глупый вопрос, включили ли вы (предположительно новый) исходный файл, содержащий реализацию project::current::Content, в шаг ссылки на ваш проект?   -  person Greg Hewgill    schedule 15.10.2009
comment
@ Грег, я так думаю? Я использую autotoolset, и иногда трудно понять, что именно происходит. Однако я могу без проблем создать новый экземпляр project::current::Content в своем тестовом приложении. Я получаю эту ошибку компоновщика только тогда, когда использую устаревший класс, что заставляет меня задаться вопросом, неправильно ли я делаю то же самое имя класса.   -  person Beau Simensen    schedule 15.10.2009
comment
@Greg также стоит отметить, что все задействованные файлы (тестовое приложение, текущий код и устаревший код) находятся в одном проекте autotoolset. Я говорю это только для того, чтобы было понятно, что унаследованный код и текущий код не находятся в отдельных библиотеках.   -  person Beau Simensen    schedule 15.10.2009
comment
Если все это находится в одной библиотеке, и тест может создавать новые экземпляры класса, вы не получите такой ошибки ссылки. Вы уверены, что все это находится в одной библиотеке?   -  person fnieto - Fernando Nieto    schedule 15.10.2009
comment
@fnieto Да, я точно знаю, что тестовое приложение может создавать экземпляры как текущего класса, так и устаревшего класса. Я получаю ошибку компоновщика только в том случае, если устаревший класс пытается создать экземпляр самого текущего класса.   -  person Beau Simensen    schedule 15.10.2009


Ответы (3)


Пробовали ли вы ::project::current::Content (обратите внимание на :: в начале ссылки).

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

person Alexander Pogrebnyak    schedule 14.10.2009
comment
Я только что попробовал это. Казалось, это не имеет значения. Спасибо за предложение! - person Beau Simensen; 15.10.2009

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

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

текущий.ч:

#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;

пространства имен.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;
}

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

person Community    schedule 15.10.2009

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

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

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

person sizzle    schedule 14.10.2009