ber*_*eal 6 c++ inheritance templates operator-overloading
我有一个层次结构,代表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> {...};
Run Code Online (Sandbox Code Playgroud)
所以我希望能够做的事情request << Header(name, value) << Param("page", "1")
(以后会WithHeaders
在相应的Response
类中重用).
我正在尝试编译的代码是:
Request rq = Request("unused", "unused", "unused");
rq << Header("name", "value");
Run Code Online (Sandbox Code Playgroud)
但是,我得到:
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]
Run Code Online (Sandbox Code Playgroud)
我必须失去了一些东西,但它似乎很容易区分Param
从Header
在编译时间.所以,问题是:
我相信它应该有用,所以它很可能是一个GCC错误. 正如@refp在评论中指出的那样,查找实际上是不明确的,而GCC在拒绝它时是正确的.
这就是你如何使它工作:
class Request: public WithQuery<Request>, public WithHeaders<Request> {
public:
using WithHeaders<Request>::operator<<;
using WithQuery<Request>::operator<<;
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1004 次 |
最近记录: |