2009-03-16 17 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; 
} 

答えて

2

でIは、(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] 

これは明示的instanceのバージョンを指定することによって固定することができます。 Cで使用する必要があります。

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

あなたが勝っています。 私はそれを使用してその使用に遭遇したことはありません。 – mawt

+0

複数の継承に起因する関数名にあいまいさがあるすべての場合に、このように "using"を使用することができます。 –

関連する問題