2016-09-01 2 views
0

Ich will, um zu bestimmen, ob das Element im Vektor zwischen seinen Nachbarn Durchschnitt ist so ich dieses ProgrammFehler in Template-Funktion mit Iteratoren

#include <iostream> 
#include <vector> 
using namespace std; 

template <typename T> 
bool is_avg(vector<T>::iterator x) {   <-- error line 
    T l = *(x - 1), m = *x, r = *(x + 1); 
    return x * 2 == l + r; 
} 

int main() { 
    vector<int> v; 
    v.push_back(2); 
    v.push_back(3); 
    v.push_back(4); 
    cout << (is_avg(v.begin() + 1) ? "Yes" : "No"); 
    return 0; 
} 

schrieb, aber es funktioniert nicht

main.cpp|6|error: template declaration of 'bool is_avg' 

Was ist falsch?

Antwort

1

Zwei Dinge: Erstens, shoudl Sie m * 2 statt x * 2 verwenden, und Sie können T von vector<T>::iterator nicht ableiten. Verwenden Sie stattdessen It als Template-Parameter:

#include <iostream> 
#include <vector> 
using namespace std; 

template <typename It> 
bool is_avg(It x) {  // <-- error line 
    auto const& l = *(x - 1), m = *x, r = *(x + 1); 
    return m * 2 == l + r; 
} 

int main() { 
    vector<int> v; 
    v.push_back(2); 
    v.push_back(3); 
    v.push_back(4); 
    cout << (is_avg(v.begin() + 1) ? "Yes" : "No"); 
} 

Live Example

+0

Danke. ('x * 2' ist ein zufälliger Fehler). Können Sie erklären, warum es nicht möglich ist, "T" von "Vektor :: iterator" abzuleiten? Kann ich eine Variable mit dem Typ 'T' erstellen, ohne'auto' zu verwenden (zB in C++ 98)? – Pavel

+1

@Pavel im Wesentlichen (Einzelheiten das Duplikat Q & A sehen), der Compiler hat das Muster 'Vektor passen :: iterator' gegen das Argument übergeben, aber während dies zu tun, kann es bei der allgemeinen Form des Musters schaut nur, und nicht "drinnen". Eine andere Phrase, die Leute benutzen, ist, dass Compiler nicht über ein '' 'hinaus sehen können, weshalb der 'Iterator' nicht übereinstimmt. – TemplateRex