2014-10-25 16 views
7

Dlaczego tak się dzieje?błąd: brak typu o nazwie "wektor" w przestrzeni nazw "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

'Wektor' jest szablonem klasy, a nie klasą. – chris

+1

Ponadto, przekazując surowy wskaźnik, gdy nie trzeba go ponownie przypisywać, nie jest to najlepszy pomysł - poleciłbym przekazać "wektor" przez odniesienie: w nagłówku funkcji użyj '&' insted of '*' i użyj argumentu jak 'std :: vector'. – GingerPlusPlus

+2

@Lidia: jeśli jedna odpowiedź rozwiązała twoje problemy, rozważ oznaczenie jej jako zaakceptowanej tak szybko, jak to możliwe. – GingerPlusPlus

Odpowiedz

11

vector jest szablon, a nie typu. Albo podać konkretną specjalność:

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

lub uczynić funkcję rodzajowe

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

może być lepiej wyłączyć za pomocą odniesienie zamiast wskaźnika:

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

lub zwrotu wektora przez wartość:

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

aby uniknąć błędów jak

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

kiedy używam szablonu, jak mówisz, pojawia się niezręczny błąd: Niezdefiniowane symbole dla architektury x86_64: "askForVector (std :: __ 1 :: vector > *)", referencje od: _main in insertionsort-GrnjUF.o ld: symbol (s) nie znaleziono dla architektury x86_64 –

+1

@LidiaFreitas: Wygląda na to, że zdefiniowałeś szablon w jednym pliku źródłowym i próbowałeś użyć go w innym. Szablony zazwyczaj muszą być zdefiniowane w nagłówku, ponieważ definicja jest potrzebna w każdym pliku źródłowym, który musi go utworzyć. Zobacz http://stackoverflow.com/questions/495021 –

4

Istnieje wiele zagadnień:

  1. wektor jest szablon, nie jest to typ, trzeba listę argumentów np szablon vector<int> w podpisie funkcji

  2. Ponieważ jesteś przechodzącą wskaźnik do wektora trzeba dereference nim przed za pomocą operatora indeksu dolnego

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

Poniższy może pracować:

#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

Ta dziwna obsada jest niepotrzebna i nieco niebezpieczna. '(* wektor) [i]' to wszystko, czego potrzeba, aby uzyskać dostęp do elementu wektorowego. –

+1

To prawda, chociaż ja wolę być nazbyt gadatliwy, żeby skutecznie wyjaśniać rzeczy. Redagowanie.. –

Powiązane problemy