C++ 如何使用来自类中另一个命名空间的同名类?

C++ 如何使用来自类中另一个命名空间的同名类?,c++,namespaces,C++,Namespaces,我在不同的命名空间中有两个同名的类。我希望其中一个类引用另一个类。原因是我正在迁移到一些较新的代码,我想更新旧代码,以便直接传递到较新的代码 下面是一个超级基本的示例: namespace project { namespace legacy { class Content { public: Content(const string& url) : url_(url) { } string url() { return url_; } private: string

我在不同的命名空间中有两个同名的类。我希望其中一个类引用另一个类。原因是我正在迁移到一些较新的代码,我想更新旧代码,以便直接传递到较新的代码

下面是一个超级基本的示例:

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 from project::legacy::Content,则会得到:

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

事实证明,这是一个GNU自动工具集问题,与实际主题无关。感谢大家的帮助和建议

您是否尝试过在引用的开头使用::项目::当前::内容通知::


在文件系统中定位文件时,类似于/PATH//FIX和PAT/TO/文件。< / P> < P>如果源文件具有相同的名称,它们将至少在Visual C++ 2008中创建同名的对象文件。这将导致一个问题,因为其中一个对象文件将覆盖另一个,链接将失败。确保重命名其中一个文件,或者更恰当地重命名其中一个对象文件

< >为了重命名VisualC++ 2008中的一个对象文件,右击源文件,然后选择属性。导航到C/C++->输出文件。将对象文件名从$IntDir\更改为$IntDir\$InputName1.obj


希望这有帮助。

你有};在第一个示例中,项目/遗留定义中缺少

在Visual Studio 2008中,该项目具有以下配置:

目前,h:

namespaces.cpp:


构建没有问题。

愚蠢的问题,您是否在项目链接步骤中包含了包含project::current::Content实现的新源文件?@Greg我想是这样的?我使用的是autotoolset,有时很难弄清楚到底发生了什么。但是,我可以在测试应用程序中创建project::current::Content的新实例,而不会出现问题。只有当我使用旧类时,我才遇到这个链接器错误,这让我怀疑我是否在错误地使用相同的类名。@Greg还值得注意的是,涉及测试应用程序、当前代码和旧代码的所有文件都在同一个autotoolset项目中。我这样说只是为了清楚遗留代码和当前代码不在单独的库中。如果所有的东西都在同一个库中,并且测试可以创建新的类实例,那么您不会得到这样的链接错误。你确定所有这些都在同一个库中吗?@fnieto是的,我确定测试应用程序可以实例化当前类和遗留类。只有当遗留类试图实例化当前类本身的实例时,我才会得到链接器错误。我只是尝试了一下。这似乎没有什么不同。谢谢你的建议!
#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;
#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;
}