2011-07-11 15 views
8

Burada, soruyu gösteren bazı temel kodlar:şablon parametreleri verildiğinde bile ptr_fun bunu belirsiz buluyor?

#include <functional> 

int func(int x) { 
    return x; 
} 

int func(int x, int y) { 
    return x + y; 
} 

int main() { 
    std::ptr_fun<int, int>(func); 
} 

Farklı sayıda parametreye sahip bir fonksiyon için 2 aşırı yükümüz var. Sonra tek parametre sürümünü bir functor’da çevirmeye çalışırım. Tabii ki, aşağıdaki hatayla karşılaştım:

 
test.cc: In function 'int main()': 
test.cc:13:29: error: call of overloaded 'ptr_fun()' is ambiguous 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.2/include/g++-v4/bits/stl_function.h:437:5: note: candidates are: std::pointer_to_unary_function std::ptr_fun(_Result (*)(_Arg)) [with _Arg = int, _Result = int] 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.2/include/g++-v4/bits/stl_function.h:463:5: note:     std::pointer_to_binary_function std::ptr_fun(_Result (*)(_Arg1, _Arg2)) [with _Arg1 = int, _Arg2 = int, _Result = int] 
func func ve ile bitmiş olabilir biliyorum, ama düşünüyorum neden bu belirsiz olduğunu düşünüyorum? Xzx55 sürümünde şablon tanımlarında varsayılan parametreler yoktur ve iki şablon parametresinin int olduğunu açıkça belirttim.

Aslında, derleyicinin esas olarak şu anda şablon örnekleme sırasında ne yaptığını yaparsam:

#include <functional> 

int func(int x) { 
    return x; 
} 

int func(int x, int y) { 
    return x + y; 
} 

std::pointer_to_unary_function<int,int> my_ptr_fun (int (*f)(int)) { 
    return std::pointer_to_unary_function<int,int>(f); 
} 

int main() { 
    my_ptr_fun(func); 
}  

Sadece iyi derler, her nasılsa belirsizlik gider! Bunun neden böyle olduğuna dair bir kimse var mı?

cevap

4

Bunun nedeni, şablonlu bir işlevi çağırdığınızda, işlev argümanlarının türüne göre türetilebilecek herhangi bir şablon parametresi belirtmeniz gerekmez. Sonuç olarak, std::ptr_fun<int, int> numaralı telefonu çağırmak, aslında std::ptr_fun aşırı yükten hangilerini çağırdığınızı belirtmez ve çözüm için bir argüman olarak ilettiğiniz işleve bağlıdır. func, std::ptr_fun aşırı yüküne aşırı yük getiren aşırı yüklere sahip olduğundan, belirsizlikler vardır.

Düzenleme: İşte benim noktayı göstermek için bir örnek - Ideone koştu, her iki işlev çağrısının da aynı tür döndürdüğünü gösterir.

#include <functional> 
#include <iostream> 
#include <typeinfo> 

double func(int x) 
{ 
    return x; 
} 

int main() 
{ 
    std::cout << typeid(std::ptr_fun<int>(func)).name() << std::endl; 
    std::cout << typeid(std::ptr_fun<int, double>(func)).name() << std::endl; 
} 
+1

Hmm, Sanırım takip ediyorum. Derleyici, hem 2 şablon argüman versiyonunu (Arg, Ret), hem de 3 argüman versiyonunu (Arg, Arg, Ret) 'yi deniyor ve' ''' 2 'Arg's ile eşleştirmeye çalışıyor ve denemeye çalışıyor. 'Ret' sonucunu çıkarmak? –

+0

@Evan - evet, söylemeye çalıştığım şey buydu. – Node

İlgili konular