2012-04-19 17 views
5
void PrintNow(const std::vector<int> &v) 
{ 
    std::cout << v[0] << std::endl; 
} 

std::vector<int>().push_back(20); // this line generates no complains 
PrintNow(std::vector<int>().push_back(20)); // error 

De VS2010 SP1:¿Podemos crear un parámetro de paso temporal 'std :: vector <int> `?

EROR C2664: 'printnow': no ​​se puede convertir el parámetro 1 de 'vacío' a 'const std :: vector < _Ty> &'

Q > ¿Es posible que podamos pasar un vector temporal para funcionar?

Respuesta

8

en C++ 11 sólo se puede hacer:

void PrintNow(const std::vector<int> &v) 
{ 
    std::cout << v[0] << std::endl; 
} 

PrintNow({20}); 

VS2010 todavía no soporta esta parte de C++ 11, aunque . (Gcc 4.4 y 3.1 hacen ruido metálico)

Si sólo necesita un único elemento a continuación, en C++ 03 que puede hacer:

PrintNow(std::vector<int>(1,20)); 

Si necesita más de un elemento, entonces no creo que haya cualquier solución de una línea. Puede hacer esto:

{ // introduce scope to limit array lifetime 
    int arr[] = {20,1,2,3}; 
    PrintNow(std::vector<int>(arr,arr+sizeof(arr)/sizeof(*arr)); 
} 

O puede escribir una función varargs que tome una lista de entradas y devuelva un vector. A menos que uses mucho esto, aunque no sé si vale la pena.

+0

La sintaxis' {20} 'es compatible al menos con GCC 4.4.5. –

+0

En C++ 03, puede usar ['boost :: list_of'] (http://www.boost.org/doc/libs/1_39_0/libs/assign/doc/index.html#list_of) para obtener una solución de línea sin variables adicionales nombradas. –

4

El problema es que std::vector::push_back() devuelve void, no es que no se puede pasar un carácter temporal a la función.

+0

'void vector :: push_back (const T & x)' – q0987

+2

@ q0987 exactamente ... por lo que devuelve 'void' ... –

3

Si todos los elementos son del mismo valor, usted tiene un constructor que se adapte a sus necesidades:

PrintNow(std::vector<int>(1,20)); 
4

El error se genera debido a que el tipo de retorno de std::vector::push_back función es void:

void push_back (const T& x); 

Pruebe lo siguiente:

PrintNow(std::vector<int>(1, 20)); 

The co de arriba usa uno de los constructores disponibles de std::vector clase:

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 
Cuestiones relacionadas