gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:04:52 25 4
gpt4 key购买 nike

我正在为应用程序编写一个新的 REST 路由器。它有一些旧的 C++ 类,称为 Route 等等。我创建了一些新类,即(您猜对了)RouteRouteManager。整个应用程序中实际上使用了 0 个命名空间。所以我想通过引入我自己的命名空间 (WebRouter) 我可以在保留项目中的旧代码的同时进行编码。

显然这没有用。我的编译器 (C++98) 提示已经定义的东西(Route 和 cout 重载)。这就是我试图实现保留旧 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;
}

路由.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() {}

具体错误是

'global constructors keyed to 2343_2__zoidfiosdiof**WebRouter**5**Route**E'的多个定义

无论我使用 using 还是使用 WebRouter:: 作为前缀,都会发生这种情况

最佳答案

有几件事应该或必须改变(我们没有你所有的源文件来检查):

  1. 不要使用 using namespace WebRouter,因为一些评论指出使用 WebRouter::
  2. 是更好的策略
  3. 您的 Route 构造函数和析构函数定义也应该位于 cpp 文件中的 WebRouter 命名空间内。
  4. Route 类的输出流重载也可以作为 friend 进入类范围内,并在命名空间内定义。

关于C++ 命名空间以维护旧代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48650478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com