本文介绍了C ++重载具有来自模板的多重继承的运算符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个层次结构,表示HTTP客户端的某些部分,如下所示:
typedef list< pair< string ,string> > KeyVal;
struct Header {string name;字符串值; ...};
struct Param {string name;字符串值; ...};
/ *包含头文件* /
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&> (*这个);
}
};
/ *包含查询参数的东西* /
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&> (*这个);
}
const KeyVal& get_query()const {return query_params;}
};
/ * Http请求具有头和查询参数* /
类请求:public WithQuery< Request> public WithHeaders< Request> {...};
因此我希望能够执行 request<< ;标题(名称,值)< Param(page,1)
(稍后将在相应的 Response $ c中重用
WithHeaders
$ c> class)。
我想编译的代码是:
请求rq =请求(未使用,未使用,未使用);
rq<<标题(name,value);
但是,我得到:
test / test_client.cpp:15:30:错误:请求成员'运算符<<'不明确
在从test / test_client.cpp:1:0: b $ b test /../ client.h:45:16:error:candidates are:
T& WithQuery< T> :: operator<<(const Param&)[with T = Request]
T& WithHeaders< T> :: operator<
Param 和 Header
。因此,问题是:
- 为什么会失败,以及如何解决?
解决方案
正如@refp在评论中指出的,查找实际上是不明确的,GCC是正确的拒绝它。 p>
这是你如何使它工作:
class Request:public WithQuery< ; Request> public WithHeaders< Request> {
public:
using WithHeaders< Request> :: operator<< ;;
使用WithQuery< Request> :: operator<< ;;
};
This is how you make it work:
class Request: public WithQuery<Request>, public WithHeaders<Request> {
public:
using WithHeaders<Request>::operator<<;
using WithQuery<Request>::operator<<;
};
这篇关于C ++重载具有来自模板的多重继承的运算符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!