5

次の設計を検討してください。

template <class SecondType>
struct First
{
    SecondType* _ptr;
};

template <class FirstType>
struct Second
{
    FirstType* _ptr;
};

型にはFirst型へのポインタがあり、Secondその逆もあります。問題は、これらは相互に依存しており、宣言する必要があるため、これを宣言できないことFirst<Second<First<Second...>>>です。

この問題を解決するには?

4

3 に答える 3

2

おそらく、CRTPのように見えますが、さらにクレイジーなものを使用した回避策です。

#include <iostream>

template <class SecondType>
struct FirstBase
{
    SecondType* _ptr;
};

template <class FirstType>
struct SecondBase
{
    FirstType* _ptr;
};

struct FirstDerived
: public FirstBase<SecondBase<FirstDerived>>
{
};

struct SecondDerived
: public SecondBase<FirstBase<SecondDerived>>
{
};

int main()
{
    FirstBase<SecondDerived> x;
    SecondBase<FirstDerived> y;
    return 0;
}

誰かがこれを行うためのよりエレガントな方法を持っているなら、私はそれを見てうれしいです.

于 2013-06-03T04:59:29.227 に答える
0

何を達成しようとしているのかはわかりませんが、以下は正常にコンパイルされます。

template <class T> struct First  { T* _ptr; };
template <class T> struct Second { T* _ptr; };

int main(){
   First<Second<First<Second<void>>>> a; // or
   First<Second<First<Second<nullptr_t>>>> b;
   return 0;
}

注 FirstType、SecondType をすべて置き換えたので、それは問題ではありません。T は、渡したものに置き換えられます。これは、テンプレートがコンパイル前に特殊化されているときに発生します。

于 2013-06-03T05:00:07.213 に答える