2013-09-18 2 views
1

это то, что я пытался (функции "удовольствие" должен быть статическим):Почему перегруженные унаследованные статические функции неоднозначны?

#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).

+2

Это не потому, что функции являются статическими, но из-за вашей иерархии классов. Удалите ключевое слово «static», и не будет никакой разницы. – SingerOfTheFall

+0

@SingerOfTheFall: они должны быть статичными, не иметь шансов сделать их функциями-членами, я имею дело с устаревшим кодом. – tmaric

+0

@ tomislav-maric: Неопределенность не исчезает, когда функции не являются статическими. – thokra

ответ

3

Вы должны поместить их в рамки себя:

class C 
: 
    public A, 
    public B 
{ 
public: 
    using A::fun; 
    using B::fun; 
}; 
1

Что вам нужно в class C «s определение:

public: 
    using A::fun; 
    using B::fun; 
1

Это не ясно, что fun() метод, который вы хотите позвонить, поэтому вы должны указать, какой из них:

int main(int argc, const char *argv[]) 
{ 
    double x = 1; 
    int y = 1; 

    A::fun(x); 
    B::fun(y); 

    return 0; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^