#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;
}
views:
629answers:
1
+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
2009-03-16 15:44:24
you sir are win.i've never come across that use of using.
mawt
2009-03-16 15:46:10
You can use "using" like this in all cases where there is ambiguity in function names arising from multiple inheritance.
Tyler McHenry
2009-03-16 15:49:34