8

Bir argüman için const referansı olan variadic şablon işlevi nasıl uzmanlaşılır?Değişken referansıyla varyant şablonu şablonu uzmanlığı

Örnek:

error: use of deleted function ‘T foo(Args ...) [with T = int; Args = {int, const char*, Test}]’ 
    auto i = foo<int>(10, "test string!", t); 




Yukarıdaki kod derler:

template<typename T, typename... Args> 
T foo(Args... args) = delete; 

template<> int foo(int a, const char* str, const Test& t) { .... } // Fails to compile 
//template<> int foo(int a, const char* str, Test) { .... } // Ok 

int main() { 

    auto i = foo<int>(10, "test string!", t); 
    return 0; 
} 

ilan const Test& argümanı ile fonksiyon foo çağrılırken, derleyici silinen işleve özel fonksiyon ve yedeklerini görmek başarısız const referansını argümandan kaldırırsam iyi olur. Neyi yanlış yapıyorum?

kod here

cevap

3

Otomatik şablon kesintisi bunu son şablon parametresi ayarlamak istediğiniz tahmin kadar akıllı değildir:

Sizin basit seçenek bir uzmanlık yerine ayrı bir aşırı sağlamaktır Test yerine const Test&. Daha fazla tür kesinti, her zaman cv niteleyicileri bir türden kaldırır.

Burada yeni açık şablon örneği:

auto i = foo<int, int, const char *, const Test&>(10, "test string!", t); 
+0

Tabii ki, ben tamamen konusunda açık örnekleme unuttum. Cevabınız için teşekkürler! – Bected

7

birincil şablon görüşmesi için anlamak şablon argümanlar int, const char* ve Test değil const Test& Bunun nedeni bulunabilir. Bu, şablon bağımsız değişkenlerinin parametrelerle eşleşmemesi nedeniyle uzmanlığınızın kullanılmadığı anlamına gelir.

template <typename T> 
T foo(int a, const char* str, const Test& t) { /*...*/; } 

Live demo