2015-11-24 16 views
6

Tôi đang gặp sự cố với std::thread vì nó không chấp nhận các chức năng lấy các đối số được chỉ định tự động. Dưới đây là một số mẫu mã:Tại sao tôi không thể sử dụng tự động với std :: thread?

#include <iostream> 
#include <vector> 
#include <thread> 

using namespace std; 

void seev(const auto &v) // works fine with const vector<int> &v 
{ 
    for (auto x : v) 
     cout << x << ' '; 
    cout << "\n\n"; 
} 

int main() 
{ 
    vector<int> v1 { 1, 2, 3, 4, 5 }; 
    thread t(seev, v1); 
    t.join(); 
    return 0; 
} 

Nhưng trình biên dịch nói:

[Error] no matching function for call to 'std::thread::thread(<unresolved overloaded function type>, std::vector<int>&)' 

Tại sao điều này xảy ra? Đây có phải là vấn đề với ngôn ngữ hoặc GCC (4.9.2) không?

+0

Đây có phải là 'C++ 14' không? – Alex

+0

có nó là @Alex –

+8

@AnkitAcharya Không, không phải. Đó là phần mở rộng gcc và được đề xuất cho C++ 17. – inf

Trả lời

13

Hãy suy nghĩ về auto làm mẫu tranh luận sau đó chức năng của bạn trông giống như:

template <class T> 
void seev (const T &v) ... 

C++ không thể mẫu nhập thể mà không đặc tả rõ ràng các loại. Đó là lý do tại sao bạn gặp lỗi. Để khắc phục vấn đề (với tuyên bố mẫu đối số), bạn có thể sử dụng:

thread t (seev<decltype(v1)>, std::ref(v1)); 
+0

điều này không quá bro, hãy thử cái gì khác –

+0

@AnkitAcharya vừa kiểm tra trên VS-2013 được biên dịch tốt. Hãy chú ý đến ghi chú của tôi về "(có khai báo đối số mẫu)" để bạn có thể sử dụng 'mẫu void seev (const T & v)' – Dewfy

+0

'http: // coliru.stacked-crooked.com/a/c740f5efcd9011f6' kiểm tra điều này –

13
void seev (const auto &v) 

không phải là hợp lệ C++ (chưa, nó được đề xuất cho C++ 17). gcc đã nói với bạn rằng bạn đã biên soạn với -pedantic.

Các vấn đề liên quan