2015-11-13 12 views
5
İşte

derleme hatası tetikleyen minimal örnektir:Neden variadic şablon parametresinin bu ikamesi başarısız oluyor? (Paket önce sabit argümanlar)

#include <utility> 
void foo(int, double, int) 
{} 

template <class... Args> 
void post_forwarder(void(*fun)(Args..., int), Args&&... aArgs) 
{ 
    fun(std::forward<Args>(aArgs)..., 5); 
} 

int main() 
{ 
    post_forwarder(foo, 6, 6.1); // Compilation error on instantiation 
    return 0; 
} 

Sorunun variadic şablon parametresi sabit int parametresi önce fonksiyon tipinde genişletilir gerçeği ile ilgilidir şüpheli Ama durum böyleyse, bunun için iyi bir gerekçe bulamıyorum. Clang 3.6 bildirdiği

hatadır:

error: no matching function for call to 'post_forwarder' 
note: candidate template ignored: failed template argument deduction 
+1

Hata gönderebilir misiniz? Bu yardımcı olur. – lodo

+1

Bir kenara göre, "Args && ..." işlevinin beklenen bir işlev işaretçisine iletilmesiyle çıkarılan "Args ..." iyi bir plan değildir. Sadece bunu bildiğinden emin olmak için. – Yakk

+0

@Yakk Kabul etmeliyim ki, yükselttiğiniz noktayla ilgili daha fazla ayrıntıyı kullanabilirim :) –

cevap

7

Argüman kesinti burada başarısız: paketleri anlaşılabilir olması için sonunda olmak zorunda Parametre genel kural için

template <class... Args> 
void post_forwarder(void(*fun)(Args..., int), Args&&... aArgs) 
          // ^^^^^^^ 

. Her zamanki çözüm, indirilemeyen bir bağlamda sarmaktır, bu nedenle kesinti bile denenmez:

+0

Teknik açıdan bakıldığında, ilk 'Args ...', henüz çıkarılmamış bir bağlamda. –

+1

@ T.C. Evet, ama şimdi bir ** süper ** çıkarımsız içerik. [Ayrıca, tam bir açıklama yok] – Barry

+0

http://stackoverflow.com/questions/26885239/whats-the-point-of-boostmplidentityttype-here. Bir sidenote olarak, bu bağlamda, “dont_deduce” gibi, bu bağlamda “kimlik” için bir takma adı tercih ederim, bu yüzden mekanizmayı anlamamış olsam bile, en azından amacın ne olduğunu biliyorum. –

0

Düzenleme: yeniden yapıldı cevap: Args..., intArgs... anlamak izin vermez

formu.

+0

Emin misin? 'Fun' imzası içinde açık bir son 'int' var, ilk 2 parametresine 'Args ...' kesintisini sınırlamasını beklerdim. –

1

Bu çalışır:

template <class F, class... Args> 
void post_forwarder(F f, Args&&... aArgs) { 
    f(std::forward<Args>(aArgs)..., 5); 
} 

LIVE DEMO

+1

Çalışıyor, ama soru önerilen minimal örnek neden çalışmadığını anlamak için denemek mi? (Önerilen alternatifinizin beklenen işlevselliğin yerini alamayacağı daha karmaşık bir sistemden çıkarıldığı için). –

+0

@AdN Üzgünüz, bazı önemli şeylerim vardı ve yanıtlayamadım. Anlaşılmaz bir bağlamdır, bu yüzden başarısız olur. Ama zaten cevabın var. – 101010

İlgili konular