views:

629

answers:

1
#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;
}
+3  A: 

I get a different, more reasonable error (with 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]

This can be fixed by explicitly specifying which version of instance should be used in C:

class C : public TA<C>, private B
{
public:
    using TA<C>::instance;
    void Func() { cout << "C" << endl; }
};
sth
you sir are win.i've never come across that use of using.
mawt
You can use "using" like this in all cases where there is ambiguity in function names arising from multiple inheritance.
Tyler McHenry