2012-04-19 25 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 

Từ VS2010 Sp1:Chúng ta có thể tạo tham số `std :: vector <int>` không?

eror C2664: 'PrintNow': không thể chuyển đổi thông số 1 từ 'khoảng trống' để 'const std :: vector < _Ty> &'

Q > Có thể chúng ta có thể truyền một vector tạm thời để hoạt động không?

Trả lời

8

Trong C++ 11 bạn chỉ có thể làm:

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

PrintNow({20}); 

VS2010 chưa hỗ trợ phần này của C++ 11 mặc dù . (Gcc 4.4 và kêu vang 3.1 làm)

Nếu bạn chỉ cần một yếu tố duy nhất sau đó trong C++ 03 bạn có thể làm:

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

Nếu bạn cần nhiều hơn một yếu tố sau đó tôi không nghĩ rằng có bất kỳ giải pháp một dòng nào. Bạn có thể làm điều này:

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

Hoặc bạn có thể viết hàm varargs lấy danh sách int và trả về vectơ. Trừ khi bạn sử dụng điều này rất nhiều mặc dù tôi không biết rằng nó có giá trị nó.

+0

Cú pháp' {20} 'được hỗ trợ trong ít nhất GCC 4.4.5. –

+0

Trong C++ 03, bạn có thể sử dụng ['boost :: list_of'] (http://www.boost.org/doc/libs/1_39_0/libs/assign/doc/index.html#list_of) cho một giải pháp tuyến tính không có biến được đặt tên bổ sung. –

4

Vấn đề là std::vector::push_back() trả về void, không phải là bạn không thể chuyển tạm thời cho hàm.

+0

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

+2

@ q0987 chính xác ... vì vậy nó trả về 'void' ... –

3

Nếu tất cả các yếu tố này là của cùng một giá trị, bạn có một nhà xây dựng phù hợp với nhu cầu của bạn:

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

Các lỗi được tạo ra bởi vì các kiểu trả về của std::vector::push_back chức năng là void:

void push_back (const T& x); 

Hãy thử các cách sau:

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

Đồng de trên sử dụng một trong những nhà xây dựng sẵn của std::vector lớp:

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 
Các vấn đề liên quan