od C++ 11 roboczej, 7,5 (p. 1):Czy zewnętrzne funkcje "C" są osobnym rodzajem?
dwa typy funkcyjnych z innym języku wiązania są różne typy, nawet jeśli nie są inaczej identyczne.
Więc mogę zrobić przeciążenie na podstawie powiązań językowych:
extern "C" typedef void (*c_function)();
typedef void (*cpp_function)();
void call_fun(c_function f)
{
}
void call_fun(cpp_function f)
{
}
extern "C" void my_c()
{
}
void my_cpp()
{
}
int main()
{
call_fun(my_c);
call_fun(my_cpp);
}
Ale z GCC 4.7.1 ten przykładowy kod daje komunikaty o błędach:
test.cpp: In function 'void call_fun(cpp_function)':
test.cpp:7:6: error: redefinition of 'void call_fun(cpp_function)'
test.cpp:4:6: error: 'void call_fun(c_function)' previously defined here
iz brzękiem ++
test.cpp:7:6: error: redefinition of 'call_fun'
void call_fun(cpp_function f)
^
test.cpp:4:6: note: previous definition is here
void call_fun(c_function f)
^
Teraz pytania:
Czy moje zrozumienie normy jest prawidłowe? Czy ten kod jest prawidłowy?
Czy ktoś wie, czy są to błędy w kompilatorach, czy też celowo robią to w ten sposób dla celów zgodności?
Tak dla przypomnienia: standard C++ 03 ma dokładnie to samo zdanie w tym samym punkcie, więc ta nie jest kwestią funkcji C++ 11, która nie jest jeszcze obsługiwana przez kompilatory. – Gorpik
Zobacz http://stackoverflow.com/a/10643935/1463922. Upewnij się, że konwencje wywoływania C i C++ są zgodne. – PiotrNycz