базовый класс, использующий тип, определенный родительским классом - PullRequest
3 голосов
/ 06 декабря 2010

У меня есть приложение Visual Studio 2008 C ++, в котором базовый класс A_Base должен создать экземпляр элемента данных, тип которого определяется родительским классом.Например:

template< typename T >
class A_Base
{
public: 
    typedef typename T::Foo Bar; // line 10

private:
    Bar bar_;
};

class A : public A_Base< A > 
{
public:
    typedef int Foo;
};

int _tmain( int argc, _TCHAR* argv[] )
{
    A a;
return 0;
}

К сожалению, похоже, что компилятор не знает, что такое T::Foo, пока не станет слишком поздно, и я получаю такие ошибки:способ достижения этого типа функциональности?

Спасибо, PaulH

Ответы [ 3 ]

5 голосов
/ 06 декабря 2010

A_Base<A> создается в точке, где A еще не завершено:

class A : public A_Base< A >

Вы можете использовать класс черт:

template<class T> struct traits;

template< typename T >
class A_Base
{
public: 
    typedef typename traits<T>::Foo Bar; // line 10

private:
    Bar bar_;
};

class A; // Forward declare A

template<> // Specialize traits class for A
struct traits<A>
{
    typedef int Foo;
};

class A : public A_Base< A > {};

int main()
{
    A a;
}
3 голосов
/ 06 декабря 2010

Вы можете попробовать следующее:

template< typename T >
class A_Base
{
public: 
    typedef typename T::Foo Bar; // line 10

private:
    Bar bar_;
};

class A_Policy
{
public:
    typedef int Foo;
};

class A : public A_Base<A_Policy>
{};

int _tmain( int argc, _TCHAR* argv[] )
{
    A a;
return 0;
}
1 голос
/ 06 декабря 2010

Класс A зависит от класса A_Base, который зависит от класса A ... и т. Д. У вас есть рекурсия здесь.Вам нужно объявить Foo в отдельном классе.

class A;

template<typename T> struct Foo;
template<> struct Foo<A> { typedef int type; };

template< typename T >
class A_Base
{
public: 
    typedef typename Foo<T>::type Bar; // line 10

private:
    Bar bar_;
};

class A : public A_Base< A > 
{
};

См. Также GotW # 79 .

...