【发布时间】:2018-02-06 19:23:31
【问题描述】:
我正在为一个应用程序编写一个新的 REST 路由器。它有一些旧的 C++ 类,称为 Route 等等。我创建了一些新类,即(你猜对了)Route 和RouteManager。在整个应用程序中实际上使用了 0 个命名空间。所以我想通过引入我自己的命名空间 (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;这就是你的问题。 -
只是不要偷懒。
using只会让你拥有Router和Router这实际上是两个不同的东西。Router和WebRouter::Router不是更容易区分吗? -
如果你去掉
using namespace WebRouter而是在RouteManager.cpp中的函数前加上WebRouter::会发生什么? -
对不起朋友,但删除
using并以WebRouter::为前缀并不能完成任何事情。它仍然向我抱怨multiple definition of 'global constructors keyed to (gibberish text)WebRouter Route -
惯用的方法是在 CPP 文件中再次声明命名空间,例如
namespace WebRouter{ Route::Route(...){} Route::~Route(){} }。
标签: c++