[C++] Błędy kompilacji przy próbie użycia dwóch funkcji szablonowych
Ostatnio zmodyfikowano 2014-12-06 18:00
maly Temat założony przez niniejszego użytkownika |
[C++] Błędy kompilacji przy próbie użycia dwóch funkcji szablonowych » 2014-12-06 14:31:33 Problem jak w tytule, chodzi mi tylko o wytłumaczenie dlaczego się nie kompiluje. #include <functional>
template < typename RetType > std::function < RetType() > funcA() { typedef RetType( __stdcall * FuncPtr )(); std::function < RetType() > funca =( FuncPtr ) nullptr; return funca; }
template < typename RetType > std::function < RetType() > funcB() { typedef RetType( __fastcall * FuncPtr )(); std::function < RetType() > funca =( FuncPtr ) nullptr; return funca; }
int main() { auto a0 = funcA < int >(); auto b0 = funcB < int >(); return 0; } -------------- Build: Debug in qqwer (compiler: i686-4.9.1-release-posix-dwarf-rt_v3-rev1)---------------
i686-w64-mingw32-g++.exe -Wall -std=c++11 -fexceptions -g -ID:\MinGW\i686-4.9.1-release-posix-dwarf-rt_v3-rev1\i686-w64-mingw32\include -ID:\MinGW\i686-4.9.1-release-posix-dwarf-rt_v3-rev1\i686-w64-mingw32\include\c++ -c D:\rar\cpp\qqwer\main.cpp -o obj\Debug\main.o C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s: Assembler messages: C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:487: Error: symbol `__ZSt4moveIRPFivEEONSt16remove_referenceIT_E4typeEOS4_' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:509: Error: symbol `__ZNSt8functionIFivEEC1IPFivEvEET_' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:769: Error: symbol `__ZNSt14_Function_base13_Base_managerIPFivEE21_M_not_empty_functionIS1_EEbRKPT_' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:793: Error: symbol `__ZNSt14_Function_base13_Base_managerIPFivEE15_M_init_functorERSt9_Any_dataOS2_' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:827: Error: symbol `__ZNSt17_Function_handlerIFivEPFivEE9_M_invokeERKSt9_Any_data' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:855: Error: symbol `__ZNSt14_Function_base13_Base_managerIPFivEE10_M_managerERSt9_Any_dataRKS4_St18_Manager_operation' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:1122: Error: symbol `__ZNSt14_Function_base13_Base_managerIPFivEE15_M_init_functorERSt9_Any_dataOS2_St17integral_constantIbLb1EE' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:1161: Error: symbol `__ZNSt14_Function_base13_Base_managerIPFivEE14_M_get_pointerERKSt9_Any_data' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:1194: Error: symbol `__ZNSt9_Any_data9_M_accessIPPFivEEERT_v' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:1219: Error: symbol `__ZNSt14_Function_base13_Base_managerIPFivEE8_M_cloneERSt9_Any_dataRKS4_St17integral_constantIbLb1EE' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:1259: Error: symbol `__ZNSt14_Function_base13_Base_managerIPFivEE10_M_destroyERSt9_Any_dataSt17integral_constantIbLb1EE' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:1358: Error: symbol `__ZNKSt9_Any_data9_M_accessIPFivEEERKT_v' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:1383: Error: symbol `__ZSt11__addressofIKPFivEEPT_RS3_' is already defined C:\DOCUME~1\maly\USTAWI~1\Temp\cceCWp2R.s:1406: Error: symbol `__ZNSt9_Any_data9_M_accessIPFivEEERT_v' is already defined Process terminated with status 1 (0 minute(s), 1 second(s)) 14 error(s), 0 warning(s) (0 minute(s), 1 second(s)) //EDIT Znalazłem coś takiego https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59949 ale i tak mi to nic nie mówi. |
|
Monika90 |
» 2014-12-06 16:24:46 Oto prostszy kod który ma ten sam problem #include <functional>
void __stdcall f() { } void __cdecl g() { }
int main() { std::function < void() > h; h = f; h = g; }
boost::function też tak ma. Można użyć lambdy żeby ukryć konwencję wywołania. |
|
maly Temat założony przez niniejszego użytkownika |
» 2014-12-06 16:38:36 Jak by miało wyglądać to ukrycie bo trochę nie nie rozumiem? |
|
Monika90 |
» 2014-12-06 16:57:54 std::function < RetType() > funca =[ func_ptr ]() { return func_ptr(); };
Gdzie func_ptr jest wskaźnikiem do funkcji, który chcesz przypisać do std::function |
|
maly Temat założony przez niniejszego użytkownika |
» 2014-12-06 17:45:20 Dla prostego przykładu który podałem to rzeczywiście działa ale jak w tą lambdę wplątać variadic? #include <windows.h> #include <functional>
template < typename RetType, typename...Args > std::function < RetType( Args...) > getProc_stdcall( const std::string & modulename, const std::string & procname ) { FARPROC farproc = nullptr; typedef RetType( __stdcall * FuncPtr )( Args...); FuncPtr ptr = reinterpret_cast < FuncPtr >( farproc ); std::function < RetType( Args...) > func = ptr; return func; }
int main() { auto f = getProc_stdcall < PROC, LPCSTR >( "opengl32.dll", "wglGetProcAddress" ); } |
|
Monika90 |
» 2014-12-06 17:55:46 std::function < RetType( Args...) > func =[ ptr ]( Args...args ) { return ptr( args...); };
|
|
maly Temat założony przez niniejszego użytkownika |
» 2014-12-06 18:00:46 A ja piszę std::function < RetType( Args...) > func =[ ptr ]( Args...args ) { return ptr( args ); }; i się dziwię czemu nie działa, chyba pora odpocząć:) Dzięki za pomoc. |
|
« 1 » |