2014-10-25 26 views
7

Perché questo sta accadendo?errore: nessun tipo denominato 'vector' nello spazio dei nomi 'std'

error: no type named 'vector' in namespace 'std'; did you mean 'hecto'? void askForVector(std::vector * vector);

#include <iostream> 
#include <vector> 

void askForVector(std::vector * vector); 

int main() 
{ 
    std::vector<int> vector; 
    int size; 
    askForVector(&vector); 
    std::cout << "\nsize: " << vector.size() << std::endl; 
    std::cout << vector.at(0); 
} 


void askForVector(std::vector * vector) 
{ 
    int size; 
    std::cout << "please insert the size of vector to order: "; 
    std::cin >> size; 

    vector->resize(size); 

    for(int i = 0; i<size; i++){ 
     std::cout << "please insert a value for the " << i+1 << " position: " ; 
     std::cin >> vector[i]; 
    } 

    for(int j: *vector) 
     std::cout << ":"<<j; 
    std::cout << ":\n"; 
} 
+3

'vector' è un modello di classe, non una classe. – chris

+1

Inoltre, passando un puntatore raw quando non è necessario riassegnarlo non è l'idea migliore - ti consiglio di passare il 'vector' per riferimento: nell'intestazione della funzione usa' & 'insted di' * ' e usa l'argomento come un 'std :: vector'. – GingerPlusPlus

+2

@Lidia: se una risposta risolve i tuoi problemi, considera di contrassegnarla come accettata il prima possibile. – GingerPlusPlus

risposta

11

vector è un modello, non è un tipo. Specificare una particolare specializzazione:

void askForVector(std::vector<int> * vector); 

o fare la funzione generica

template <typename T> 
void askForVector(std::vector<T> * vector); 

Si potrebbe essere meglio utilizzare un riferimento piuttosto che un puntatore:

void askForVector(std::vector<int> & vector); 

o la restituzione del vettore per valore:

std::vector<int> askForVector() { 
    std::vector<int> vector; 
    // your code here 
    return vector; 
} 

Per evitare errori come

std::cin >> vector[i]; // should be (*vector)[i] 
+2

quando uso il modello come dici tu ottengo un errore scomodo: Simboli indefiniti per architettura x86_64: "askForVector (std :: __ 1 :: vector > *)", riferito da: _main in insertionsort-GrnjUF.o ld: simbolo/i non trovato per l'architettura x86_64 –

+1

@LidiaFreitas: Sembra che tu abbia definito il modello in un file sorgente e provato a usarlo in un altro. I modelli di solito devono essere definiti in un'intestazione, poiché la definizione è necessaria in ogni file sorgente che deve essere istanziato. Vedi http://stackoverflow.com/questions/495021 –

4

Ci sono diverse questioni:

  1. vettore è un modello, non un tipo, è necessario all'elenco dei modelli argomenti per esempio vector<int> nella firma funzione di

  2. Dal momento che si sta passando un puntatore a un vettore è necessario dereferenziarlo prima di utilizzando l'operatore pedice

    std::cin >> vector[i]; // wrong 
    std::cin >> (*vector)[i]; // correct 
    

Il seguente potrebbe funzionare:

#include <iostream> 
#include <vector> 

void askForVector(std::vector<int> * vector); 

int main() 
{ 
    std::vector<int> vector; 
    int size; 
    askForVector(&vector); 
    std::cout << "\nsize: " << vector.size() << std::endl; 
    std::cout << vector.at(0); 

} 


void askForVector(std::vector<int> * vector) 
{ 
    int size; 
    std::cout << "please insert the size of vector to order: "; 
    std::cin >> size; 

    vector->resize(size); 

    for (int i = 0; i<size; i++){ 
     std::cout << "please insert a value for the " << i + 1 << " position: "; 
     std::cin >> (*vector)[i]; 
    } 

    for (int j : *vector) 
     std::cout << ":" << j; 
    std::cout << ":\n"; 
} 

Example

+3

Quel cast strano non è necessario e in qualche modo pericoloso. '(* vector) [i]' è tutto ciò che è necessario per accedere ad un elemento vettoriale. –

+1

Questo è vero, anche se in qualche modo preferisco essere eccessivamente prolisso per spiegare le cose in modo efficace. La modifica.. –

Problemi correlati