我正在进行POC实现,并且根据要求我需要扩展std::vector
插入API,这将只采用单个参数(要插入的值),并且内部代码会在容器的末尾添加它。
我创建了一个派生自std::vector
的自定义类(ValVector),并定义了一个自定义插入API,它接受单个参数但在编译时
抛出错误。
以下是带有错误消息的代码段:
#include <iostream>
#include <vector>
using namespace std;
typedef bool BOOL;
template<class T, class Allocator = allocator<T>>
class ValVector : public std::vector<T, Allocator> {
public:
BOOL insert(const T& elem) { return (this->insert(this->end(),elem)!=this->end()); }
};
int main ()
{
std::vector<int> myvector (3,100);
std::vector<int>::iterator it;
myvector.push_back (200 );
ValVector<int> mKeyAr;
mKeyAr.insert(10); //
std::cout << "myvector contains:";
for (auto it=mKeyAr.begin(); it<mKeyAr.end(); it++)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
错误讯息:
In instantiation of 'BOOL ValVector<T, Allocator>::insert(const T&) [with T = int; Allocator = std::allocator<int>; BOOL = bool]':
23:19: required from here
11:72: error: no matching function for call to 'ValVector<int>::insert(std::vector<int>::iterator, const int&)'
11:72: note: candidate is:
11:10: note: BOOL ValVector<T, Allocator>::insert(const T&) [with T = int; Allocator = std::allocator<int>; BOOL = bool]
11:10: note: candidate expects 1 argument, 2 provided In member function 'BOOL ValVector<T, Allocator>::insert(const T&) [with T = int; Allocator = std::allocator<int>; BOOL = bool]':
11:88: warning: control reaches end of non-void function [-Wreturn-type]
答案 0 :(得分:4)
要解决您的实际问题:在类中声明一个函数会隐藏该类中所有同名的继承函数。换句话说,因为ValVector
有一个名为insert
的函数,所以继承的std::vector::insert
不再可见。解决此问题的最佳方法可能是使用insert
声明将继承的using
带回范围:
template<class T, class Allocator = allocator<T>>
class ValVector : public std::vector<T, Allocator> {
public:
using std::vector<T, Allocator>::insert;
BOOL insert(const T& elem) { return (this->insert(this->end(),elem)!=this->end()); }
};
但是,我有一个评论要做。我认为你的做法是错误的。 std
个容器不用于公共继承;如果没有别的,他们没有虚拟析构函数,也没有受保护的成员。您最好提供免费功能,然后可以与任何std::vector
一起使用,而不仅仅是您的类型:
template <class T, class A>
BOOL insert(std::vector<T, A> &vec, const T &val)
{
return vec.insert(vec.end(), val) != vec.end();
}
或者使它更通用于任何容器:
temlate <class C, class E>
BOOL insert(C &cont, const E &val)
{
return cont.insert(cont.end(), val) != cont.end();
}
答案 1 :(得分:1)
当您为不虚拟的东西创建自己的插入成员函数时,您可以从较高的位置隐藏所有相同的名称函数(我认为它被称为阴影)。您现在正在尝试调用不再可见的函数。
是否有充分的理由不单独创建一个能够满足您需要的功能,或者您是否必须从矢量中获取它?您所做的一切都不需要访问受保护的数据或功能......
FragmentManager frgmanager = getFragmentManager();
frgmanager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
FragmentTransaction frgTransaction = frgmanager.beginTransaction();
if(subitem.equalsIgnoreCase("subitem")){
Frag1 frg1 =new Frag1(mCtx);
frgTransaction.replace(R.id.inflate_layout, frg1);
}else if(subitem1.equalsIgnoreCase("subitem1")){
Frag2 frg2 =new Frag2(mCtx);
frgTransaction.replace(R.id.inflate_layout, frg2);
}else{
Frag2 frg3 =new Frag3(mCtx);
frgTransaction.replace(R.id.inflate_layout, frg3);
}
frgTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
frgTransaction.commit();
答案 2 :(得分:0)
只需更改您的插入实现,如下工作
BOOL insert(const T& elem) { return (std::vector<T>::insert(this->end(),elem)!=this->end()); }
干杯