如何在我的类中使用另一个名称空间中具有相同名称的类?

时间:2009-10-14 22:08:24

标签: c++ namespaces

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

这是一个超级基本的例子:

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问题,与实际主题无关。感谢大家的帮助和建议!

3 个答案:

答案 0 :(得分:0)

您是否尝试过::project::current::Content(在参考开始时注意::)。

在文件系统中查找文件时,这类似于/path/to/filepath/to/file

答案 1 :(得分: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;
}

构建没有问题。

答案 2 :(得分:-1)

如果源文件具有相同的名称,则它们将创建具有相同名称的目标文件(至少在Visual C ++ 2008中)。这将导致问题,因为其中一个目标文件将覆盖另一个目标文件,并且链接将失败。确保您重命名其中一个文件或更正确,重命名其中一个目标文件。

要在Visual C ++ 2008中重命名其中一个目标文件,请右键单击源文件,然后选择属性。导航到C / C ++ - &gt;输出文件。将对象文件名从$(IntDir)\更改为$(IntDir)\ $(InputName)1.obj。

希望这有帮助。