2013-04-15 14 views
7

Bir şablon sınıfı oluşturuyorum ve T'yi varsayılan tür bağımsız değişken olarak geçiriyorum. Ancak bu derleme başarısızlığına neden olur. Herkes ne olduğunu açıklayabilir mi? Teşekkür ederim!Neden dış şablondan std :: işlevine öntanımlı argüman olarak aktarılsın derleme hatası?

PS. Kullandığım derleyici VS2012'dir.

#include <functional> 

using namespace std; 

template <typename T = void()> 
struct delegate 
{ 
    typedef function<T> function_t; 

    function_t f; 
}; 

int main() 
{ 
    delegate<> d; 

    return 0; 
} 

Derleyici çıkışları:

1>.\Microsoft Visual Studio 11.0\VC\include\functional(554): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>' 
1>   with 
1>   [ 
1>    _Tx=void (__cdecl *)(void) 
1>   ] 
1>   test.cpp(12) : see reference to class template instantiation 'std::function<_Fty>' being compiled 
1>   with 
1>   [ 
1>    _Fty=void (__cdecl *)(void) 
1>   ] 
1>   test.cpp(17) : see reference to class template instantiation 'delegate<>' being compiled 
1>.\Microsoft Visual Studio 11.0\VC\include\functional(555): error C2504: 'type' : base class undefined 
1>.\Microsoft Visual Studio 11.0\VC\include\functional(558): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>' 
1>   with 
1>   [ 
1>    _Tx=void (__cdecl *)(void) 
1>   ] 
1>.\Microsoft Visual Studio 11.0\VC\include\functional(558): error C2146: syntax error : missing ';' before identifier '_Mybase' 
1>.\Microsoft Visual Studio 11.0\VC\include\functional(558): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
+2

Bir MSVC derleyici hatası gibi görünüyor. G ++ 4.7.0 altında iyi derler. – Yuushi

+0

@Yuushi Ah gerçekten mi? Çok teşekkür ederim. Sadece <0 işlevinin varsayılan bir versiyonunu yapmak istedim. Bu fonksiyon işlevine eşdeğerdir. –

+1

Derleyici 'T''nizi' void() 'yerine bir' void (*)() 'ye çevirir, sonra' std :: işlevine iletir, ki bu 'std' ye geçmek için geçerli bir tür değildir. : function'. Muhtemelen bir argüman olarak "A (B ...)" veya "A (*) (B ...)' yi, diğeriyle de "şablon F sınıfı" ve "F Eğer konu üzerinde gerçekten çalışmak istiyorsan. – Yakk

cevap

2

sorunuza yorumlarla gösterdiği gibi: Bu Visual Studio sadece bir hata değil, C++ kodu ile yanlış bir şey olduğunu. @ Stephan-T-Lavavej, DevDiv # 671343 olarak dosyalandığını söyledi. (Msvc yerine hatalı void() arasında void(*)() olarak T tedavisi) Yakk teşhisine @ varsayarsak

doğru, evvelce

typedef function<typename remove_pointer<T>::type> function_t; 

"mümkün geçici" önerilmiştir ama @JoshPeterson aşağıdaki tavsiye edildiği gibi, hata hala cereyan Bu değişiklikle bile VS2013, bu yüzden aslında bir geçici çözüm değildir.

+1

Visual Studio 2013'ü kullanarak "typedef function :: type> function_t;' ile "typedef function function_t;" işlevini değiştirdim ve sorun hala devam ediyor. –

+0

Hem orijinal sorunu hem de önerilen çalışmayı Visual Studio 2013 Güncelleştirme 1'de denedim. Yine de, derleme yapamaz. –

İlgili konular