我在不同的命名空间中有两个具有相同名称的类。我希望其中一个类引用另一个类。原因是我正在迁移到一些较新的代码,我想更新旧代码以简单地传递给更新的代码。
这是一个超级基本的例子:
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问题,与实际主题无关。感谢大家的帮助和建议!
答案 0 :(得分:0)
您是否尝试过::project::current::Content
(在参考开始时注意::
)。
在文件系统中查找文件时,这类似于/path/to/file
和path/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。
希望这有帮助。