это то, что я пытался (функции "удовольствие" должен быть статическим):Почему перегруженные унаследованные статические функции неоднозначны?
#include<iostream>
class A
{
public:
static void fun(double x) { std::cout << "double" << std::endl; }
};
class B
{
public:
static void fun(int y) { std::cout << "int" << std::endl; }
};
class C
:
public A,
public B
{
};
int main(int argc, const char *argv[])
{
double x = 1;
int y = 1;
C::fun(x);
C::fun(y);
return 0;
}
и используя г ++ (GCC) 4.8.1 20130725 (пререлиз), я получил следующее сообщение об ошибке:
main.cpp: In function 'int main(int, const char**)':
main.cpp:27:5: error: reference to 'fun' is ambiguous
C::fun(x);
^
main.cpp:12:21: note: candidates are: static void B::fun(int)
static void fun(int y) { std::cout << "int" << std::endl; }
^
main.cpp:6:21: note: static void A::fun(double)
static void fun(double x) { std::cout << "double" << std::endl;
Так что мой вопрос: как прийти в C++, если я могу переопределить member functions, а не статические функции? Почему в этом случае не работает перегрузка? Я бы ожидал, что компилятор принесет «удовольствие» в пространство имен C ::, а затем назовет mangling и использует перегрузку, чтобы отличать C :: fun (int) и C :: fun (double).
Это не потому, что функции являются статическими, но из-за вашей иерархии классов. Удалите ключевое слово «static», и не будет никакой разницы. – SingerOfTheFall
@SingerOfTheFall: они должны быть статичными, не иметь шансов сделать их функциями-членами, я имею дело с устаревшим кодом. – tmaric
@ tomislav-maric: Неопределенность не исчезает, когда функции не являются статическими. – thokra