我正在为应用程序编写新的REST路由器。它有一些旧的C++类,称为Route
等。我创建了一些新类,即(您猜对了)Route
和RouteManager
。在整个应用程序中实际上使用了0个 namespace 。因此,我想通过引入自己的 namespace (WebRouter
)进行编码,同时将旧代码保留在项目中。
显然,这没有用。我的编译器(C++ 98)抱怨已经定义的东西(Route
和cout重载)。这就是我尝试实现保留旧Route
类同时命名新的Route
类的目标的方式。
Route.hpp
namespace WebRouter {
// complains this is defined, which it is for the old Route..
class Route {
private:
protected:
public:
string uri;
string method;
Route(string uri, string method);
~Route();
};
}
// complains this is already defined, which it is for the old Route..
ostream &operator<<(std::ostream &os, WebRouter::Route const &route) {
os << "--- Route ---" << endl;
os << "- URI: " << route.uri << endl;
os << "- Method: " << route.method << endl;
os << "-------------" << endl;
return os;
}
Route.cpp
#include "Route.hpp"
using namespace WebRouter;
Route::Route(string uri, string method){
this->uri = uri;
this->method = method;
}
Route::~Route(){}
RouteManager.hpp
namespace WebRouter {
class RouteManager {
private:
vector<Route> RouteVector;
protected:
public:
RouteManager();
~RouteManager();
Route* FindRoute(string uri, string method);
};
}
RouteManager.cpp
#include "RouterManager.hpp"
using namespace WebRouter;
RouteManager::RouteManager() {}
RouteManager::~RouteManager() {}
具体错误是
multiple definition of 'global constructors keyed to 2343_2__zoidfiosdiof**WebRouter**5**Route**E'
无论我是
using
还是WebRouter::
前缀,都会发生这种情况 最佳答案
应该或必须更改几件事(我们没有所有源文件都可以检查):
using namespace WebRouter
,因为一些评论指出使用WebRouter::
更好的策略Route
构造函数和析构函数定义也应该位于cpp文件中的WebRouter
命名空间内。 Route
类的输出流重载也可以作为 friend 进入类范围,并在命名空间内定义。 关于c++ - C++命名空间以维护旧代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48650478/