C++重载运算符,具有从模板的多个继承
C++ overloading operator with multiple inheritance from templates
我有一个层次结构,它代表HTTP客户端的某些部分,看起来像这样:
typedef list<pair<string, string> > KeyVal;
struct Header { string name; string value; ...};
struct Param { string name; string value; ...};
/* Something that contains headers */
template<typename T> class WithHeaders {
KeyVal headers;
public:
virtual T &operator <<(const Header &h) {
headers.push_back(pair<string, string>(h.name, h.value));
return static_cast<T&> (*this);
}
};
/* Something that contains query params */
template<class T> class WithQuery {
KeyVal query_params;
public:
virtual T &operator <<(const Param &q) {
query_params.push_back(pair<string, string>(q.name, q.value));
return static_cast<T&> (*this);
}
const KeyVal &get_query() const {return query_params;}
};
/* Http Request has both headers and query parameters */
class Request: public WithQuery<Request>, public WithHeaders<Request> {...};
这样我希望能够做request << Header(name, value) << Param("page", "1")
之类的事情(稍后将在相应的Response
类中重用WithHeaders
)。
我正在尝试编译的代码是:
Request rq = Request("unused", "unused", "unused");
rq << Header("name", "value");
但是,我得到:
test/test_client.cpp:15:30: error: request for member ‘operator<<’ is ambiguous
In file included from test/test_client.cpp:1:0:
test/../client.h:45:16: error: candidates are:
T& WithQuery<T>::operator<<(const Param&) [with T = Request]
T& WithHeaders<T>::operator<<(const Header&) [with T = Request]
我一定错过了一些东西,但在编译期间似乎很容易区分Param
和Header
。所以,问题是:
- 为什么会失败以及如何修复?
- 这是一件合理的事情,还是有一个更简单的设计?
我相信它应该有效,所以它很可能是一个 GCC 错误。 正如@refp在评论中指出的那样,查找实际上是模棱两可的,GCC 拒绝它是正确的。
这是您使其工作的方式:
class Request: public WithQuery<Request>, public WithHeaders<Request> {
public:
using WithHeaders<Request>::operator<<;
using WithQuery<Request>::operator<<;
};
现场示例
相关文章:
- 通过继承类使用来自不同命名空间的运算符
- 运算符继承和 cpp 核心准则 c.128 的问题
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 继承模板化转换运算符
- C++ 继承运算符=
- 在继承的模板类中使用下标 [] 运算符
- 如何调用继承的重载运算符<<并在派生类的输出中添加更多文本?
- C++模板化类上继承的运算符'<<'
- 类继承和运算符重载
- 通过继承重载运算符会导致歧义
- 使用继承的指针列表复制构造函数或重载运算符=
- C++中移动赋值运算符的继承
- 如何在C++上的多个继承上下文上使用特定基类中的运算符
- 继承类中的比较运算符
- 继承 C++14 中的模板化运算符 =:g++ 和 clang++ 的不同行为
- 具有继承的未声明标识符(运算符 ostream)
- 如何使用运算符编写可继承的模板类
- C++继承运算符<<
- 继承运算符 +()
- 继承运算符*的问题