C ++命名空间以维护旧代码

时间:2018-02-06 19:23:32

标签: c++

我正在为应用程序编写一个新的REST路由器。它有一些名为Route的旧C ++类,依此类推。我已经创建了一些新类,即(你猜对了)RouteRouteManager。在整个应用程序中使用了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::

,都会发生这种情况

1 个答案:

答案 0 :(得分:1)

应该或必须更改一些内容(我们没有所有源文件来检查):

  1. 请勿使用using namespace WebRouter,因为有几条评论声明使用WebRouter::
  2. 是更好的政策
  3. 您的Route构造函数和析构函数定义也应该放在cpp文件中的WebRouter命名空间内。
  4. Route类的输出流重载也可以作为朋友进入类范围内并在命名空间内定义。