无法重载现有的std :: vector函数

时间:2015-07-08 11:51:46

标签: c++ vector stl

我正在进行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] 

3 个答案:

答案 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()); }

干杯