2015-07-08 31 views
5

Wykonuję implementację POC i zgodnie z wymogiem muszę rozszerzyć interfejs API wstawki std :: vector, który wymagałby tylko jednego parametru (wartość do wstawienia) i wewnętrznie kod byłby dodaj to na końcu kontenera.Nie można przeciążać istniejących funkcji std :: vector

Stworzyłem niestandardową klasę (ValVector) wyprowadzoną ze std :: vector i zdefiniowałem niestandardowy interfejs API Insert, który akceptuje pojedynczy parametr, ale podczas kompilowania go zgłasza błąd.

Doceń za szybką odpowiedź.

Poniżej znajduje się fragment kodu z komunikatem o błędzie: Komunikat

#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; 
} 

Błąd:

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] 
+2

+1 , kompletny, minimalny kod, pełny opis błędu, zwięzły opis problemu i przyczyna tego. –

+1

Nie powinienem publicznie dziedziczyć po 'std :: vector', jeśli się nie mylę, jego destruktor nie jest zadeklarowany jako wirtualny. –

+1

@ burton0 - Nie wirtualny destruktor jest w porządku, o ile nie usuniesz 'ValVectora' używając wskaźnika do 'std :: vector'. –

Odpowiedz

1

Po dokonaniu własną funkcję wkładka do czegoś, co nie jest wirtualny ukryć wszystkie takie same nazwij funkcje z góry (myślę, że to się nazywa shadowing). Próbujesz teraz wywołać funkcję, która nie jest już widoczna.

Czy istnieje dobry powód, aby nie tworzyć oddzielnej funkcji, która spełnia to, czego potrzebujesz, czy też musisz czerpać ją z wektora? Nic nie robisz wymaga dostępu do chronionych danych lub funkcji ...

// from 
vector.insert(data); 
// to 
insert_poc(vector, data); 
4

Aby rozwiązać rzeczywisty pytanie: deklarowania funkcji w klasie ukrywa wszystkie odziedziczone funkcje o tej samej nazwie w tej klasie. Innymi słowy, ponieważ ValVector ma funkcję o nazwie insert, odziedziczony std::vector::insert nie jest już w niej widoczny. Prawdopodobnie najlepszym sposobem rozwiązania tego jest doprowadzenie odziedziczony insert powrotem do zakresu z deklaracją 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()); } 
}; 

Mam jednak komentarz do wykonania. Myślę, że twoje podejście jest złe. std kontenery nie są przeznaczone do dziedziczenia publicznego; jeśli nic innego, nie mają wirtualnego destruktora i żadnych chronionych członków. Byłbyś lepiej zapewniając bezpłatną funkcję, która może następnie być używany z dowolnym std::vector, nie tylko twój typ:

template <class T, class A> 
BOOL insert(std::vector<T, A> &vec, const T &val) 
{ 
    return vec.insert(vec.end(), val) != vec.end(); 
} 

Albo zrobić to nieco bardziej ogólne pracować z każdym pojemniku:

temlate <class C, class E> 
BOOL insert(C &cont, const E &val) 
{ 
    return cont.insert(cont.end(), val) != cont.end(); 
} 
0

Wystarczy zmienić implementację insert jak następuje go do pracy

BOOL insert(const T& elem) { return (std::vector<T>::insert(this->end(),elem)!=this->end()); } 

Cheers

Powiązane problemy