Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Błędy kompilacji przy próbie użycia dwóch funkcji szablonowych

Ostatnio zmodyfikowano 2014-12-06 18:00
Autor Wiadomość
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.

C/C++
#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 a1 = funcA<int>();
   
    auto b0 = funcB < int >();
    //auto b1 = 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.
P-122346
Monika90
» 2014-12-06 16:24:46
Oto prostszy kod który ma ten sam problem
C/C++
#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.
P-122358
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?
P-122359
Monika90
» 2014-12-06 16:57:54
C/C++
std::function < RetType() > funca =[ func_ptr ]() { return func_ptr(); };
Gdzie func_ptr jest wskaźnikiem do funkcji, który chcesz przypisać do std::function
P-122362
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?

C/C++
#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; //::GetProcAddress(hinstance, procname.c_str());
   
    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" );
}
P-122365
Monika90
» 2014-12-06 17:55:46
C/C++
std::function < RetType( Args...) > func =[ ptr ]( Args...args ) { return ptr( args...); };
P-122368
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.
P-122369
« 1 »
  Strona 1 z 1