2015-07-08 6 views
5

Ich mache eine POC-Implementierung und je nach Anforderung muss ich STD :: Vector einfügen API, die nur einzelne Parameter (Wert einzufügen) würde und intern würde der Code würde Füge dies am Ende des Behälters hinzu.Nicht in der Lage, vorhandene std :: vector Funktionen zu überladen

Ich erstellt eine benutzerdefinierte Klasse (ValVector) abgeleitet von Std :: Vektor und definierte eine benutzerdefinierte Insert-API, die einzelne Parameter akzeptiert, aber während der Kompilierung löst Fehler.

Schätzen Sie für schnelle Antwort.

unten ist das Snippet-Code mit Fehlermeldung:

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

Fehlermeldung:

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 , vollständiger, minimaler Code, vollständige Fehlerbeschreibung, kurze Beschreibung des Problems und warum dies versucht wird. –

+1

Ich sollte besser nicht von 'std :: vector' erben, wenn ich mich nicht irre, wird sein Destruktor nicht als virtuell deklariert. –

+1

@ burton0 - Der nicht-virtuelle Destruktor ist in Ordnung, solange Sie keinen 'ValVector' mit einem Zeiger auf' std :: vector' löschen. –

Antwort

1

Wenn Sie Ihre eigenen Einsatzelement Funktion für etwas zu machen, die Sie verstecken ist nicht virtuell alle gleich Name funktioniert von oben nach oben (ich denke, es heißt Shadowing). Sie versuchen nun, eine Funktion aufzurufen, die nicht mehr sichtbar ist.

Gibt es einen guten Grund, nicht nur eine separate Funktion zu erstellen, die das tut, was Sie brauchen, oder müssen Sie dies vom Vektor ableiten? Nichts, was Sie tun, erfordert den Zugriff auf geschützte Daten oder Funktionen ...

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

Ihre eigentliche Frage zu beantworten: eine Funktion in einer Klasse deklarieren blendet alle geerbten Funktionen mit dem gleichen Namen in dieser Klasse. Mit anderen Worten, weil ValVector eine Funktion mit dem Namen insert hat, ist die geerbte std::vector::insert darin nicht mehr sichtbar. Wahrscheinlich der beste Weg, dies zu lösen, ist die geerbte insert zurück zum Umfang zu bringen mit einer using Erklärung:

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

Ich habe allerdings einen Kommentar zu machen. Ich denke, deine Herangehensweise ist falsch. std Container sind nicht für die öffentliche Erbschaft bestimmt; wenn nichts anderes, haben sie keinen virtuellen Destruktor und keine geschützten Mitglieder. Sie wären besser dran, eine kostenlose Funktion bereitstellt, die dann mit jedem std::vector verwendet werden könnten, nicht nur Ihre Art:

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

Oder machen Sie es ein bisschen mehr Generika mit jedem Behälter zu arbeiten:

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

einfach Ihre Einsatz Umsetzung wie folgt für sie

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

Prost