2013-04-15 2 views
7

Ich erstelle eine Template-Klasse und übergeben Sie das T als ein Standardtyp Argument. Dies verursacht jedoch einen Kompilierungsfehler. Jeder kann erklären, was passiert? Vielen Dank!Warum führt das Übergeben von T von der äußeren Vorlage als Standardargument an std :: function zu einem Kompilierungsfehler?

PS. Der Compiler, den ich verwende, ist VS2012.

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

Compiler Ausgänge:

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

Sieht aus wie ein MSVC-Compiler-Fehler. Kompiliert unter g ++ 4.7.0. – Yuushi

+0

@Yuushi Ach wirklich? Vielen Dank. Ich wollte nur eine Standardversion der Funktion <> erstellen, die der Funktion entspricht. –

+1

Der Compiler verwandelt Ihr 'T' in ein' void (*)() 'anstelle von' void() 'und übergibt es dann an' std :: function', was kein gültiger Typ ist, der an 'std übergeben wird: : Funktion'. Sie könnten wahrscheinlich einen Workaround programmieren, der entweder 'A (B ...)' oder 'A (*) (B ...)' als ein Argument und eine 'Schablone Klasse F' als die andere und' F "Wenn Sie wirklich das Problem umgehen wollten. – Yakk

Antwort

2

Wie die Kommentare zu Ihrer Frage angezeigt: Dies ist nur ein Fehler in Visual Studio ist, nichts falsch mit Ihrem C++ Code. @ Stephan-T-Lavavej sagt, er hat es als DevDiv # 671343 eingereicht.

Unter der Annahme @ Yakk Diagnose korrekt ist (falsch MSVC T als void(*)() statt void() Behandlung), habe ich vorgeschlagen, früher die „mögliche Abhilfe“ von

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

aber als @JoshPeterson unten kommentiert, immer noch der Fehler tritt in VS2013 selbst mit dieser Änderung, so ist es nicht eigentlich eine Umgehungslösung.

+1

Mit Visual Studio 2013 ersetzte ich 'typedef Funktion function_t;' mit 'typedef function :: type> function_t;' und das Problem weiterhin auftritt. –

+0

Ich habe gerade sowohl das ursprüngliche Problem und die vorgeschlagene Arbeit in Visual Studio 2013 Update 1 ausprobiert. Trotzdem wird keiner kompilieren. –

Verwandte Themen