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
Sieht aus wie ein MSVC-Compiler-Fehler. Kompiliert unter g ++ 4.7.0. – Yuushi
@Yuushi Ach wirklich? Vielen Dank. Ich wollte nur eine Standardversion der Funktion <> erstellen, die der Funktion entspricht. –
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