2009-03-16 15 views
0
#include <iostream> 
using namespace std; 

/* 

     TA  <-- defines static function 
    / \ 
    |  B <-- subclass TA, inherits it so B::StaticFunc can be used. 
    \ /
     C  <-- want to inherit static func from A, subclass B privately 
*/ 

template <class T> class TA 
{ 
public: 
    // return ptr to new instance of class T 
    static T * instance() 
    { 
     static T inst; 
     return &inst; 
    } 
}; 


class B : public TA<B> 
{ 
public: 
    void Func() { cout << "B" << endl; } 
}; 


/* HERE: class C : public TA<C> */ 
class C : public TA<C>, private B 
{ 
public: 
    void Func() { cout << "C" << endl; } 
}; 

int main() 
{ 
    C test(); 

    B::instance()->Func(); 
    C::instance()->Func(); 

    /* 
    Expected output: 
     B 
     C 

    Actual error: 
     error: `instance' is not a member of `C'| 

     If i do not subclass B with C, then it compiles. However, I need 
     C to provide some other functionality and but a subclassable Singleton 
    */ 

    return 0; 
} 

Antwort

2

ich ein anderen, angemessenere Fehler (mit g ++ 4.3.3):

tst.cpp: In function ‘int main()’: 
tst.cpp:49: error: reference to ‘instance’ is ambiguous 
tst.cpp:22: error: candidates are: static T* TA<T>::instance() [with T = B] 
tst.cpp:22: error:     static T* TA<T>::instance() [with T = C] 

Diese explizit festgelegt werden kann, welche Version von instance Angabe sollte in C verwendet werden:

class C : public TA<C>, private B 
{ 
public: 
    using TA<C>::instance; 
    void Func() { cout << "C" << endl; } 
}; 
+0

Sie Sir gewinnen. Ich habe nie die Verwendung von verwendet. – mawt

+0

Sie können "using" in allen Fällen verwenden, in denen Mehrdeutigkeiten bei Funktionsnamen auftreten, die durch Mehrfachvererbung entstehen. –