Статический шаблон C ++ MI - статический метод исчезает при соединении - PullRequest
0 голосов
/ 16 марта 2009
#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;
}

1 Ответ

2 голосов
/ 16 марта 2009

Я получаю другую, более разумную ошибку (с 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; }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...