2015-11-24 21 views
6

std::thread ile ilgili bir sorunla karşılaşıyorum çünkü otomatik olarak belirtilen argümanları alan işlevleri kabul etmiyor. İşte bazı örnek kod:Neden std :: thread ile otomatik kullanamıyorum?

#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; 
} 

Fakat derleyici diyor:

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

neden oluyor? Dil veya GCC (4.9.2) ile ilgili bir sorun mu var? ++

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

C olamaz türlerin açık spec olmadan vücut bulmuş şablonu:

+0

Bu 'C++ 14' mü? – Alex

+0

evet, @Alex –

+8

@AnkitAcharya Hayır, öyle değil. Bu bir gcc uzantısı ve C++ 17 için önerildi. – inf

cevap

13

yaklaşık auto bir şablon argüman olarak düşünün sonra işlev gibi görünüyor. Bu yüzden bir hata aldınız. (Bu C++ 17 için önerilmektedir, henüz) ++

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

düşünceye göre farklı olduğumu fark ettim, bu çok başarısız kardeşim, başka bir şey deneyin –

+0

@AnkitAcharya sadece VS-2013'te iyi bir şekilde kontrol edildi. Lütfen "(şablon argüman bildirimi ile) hakkındaki notuma dikkat edin, böylece" şablon void seev (const T & v) " – Dewfy

+0

" http: // coliru.stacked-crooked.com/a/c740f5efcd9011f6' Bu –

13
void seev (const auto &v) 

geçerli C değil: kullanabileceğiniz (şablon argümanı bildirimiyle) sorunu gidermek için. gcc, -pedantic ile derlediğini söylemiş olurdu.

İlgili konular