5

面接でこんな質問を受けましたが、まだ解決方法がわかりません。

C++ コードがあるとします。

int main(int argc, char* argv[])
{
    L<A>* pA = 0;
    L<B>* pB = 0;
    pA = pB;
}

これが実際にコンパイルされるようにするには、何を追加する必要がありますか?

Lつまり、 、AおよびBクラスをどのように定義すればよいのでしょうか。プリプロセッサのディレクティブは使用しないでください。

私はそれを解決する方法しか考えていません:

template<class T> struct L {};
struct A {};
typedef A B;

または、前方宣言を使用するとさらに簡単になります。

struct A;
typedef A B;
template<class> struct L;

他のアイデアはありますか?

4

3 に答える 3

9

プリプロセッサ ディレクティブなし:

/* <-- added line

int _tmain(int argc, _TCHAR* argv[])
{
    L<A>* pA;
    L<B>* pB;
    pA = pB;

    return 0;
}

*/ //<-- added line

int main()
{
}

私にとってはうまくいきます。

于 2012-09-20T15:31:05.553 に答える
6

簡単な方法:から継承するL<>ように専門化する:L<B>L<A>

template<>
struct L<B> : public L<A> {};
于 2012-09-20T15:33:18.457 に答える
5

は、L<A>*から割り当て可能である必要があります。L<B>*つまりL<B>、のサブクラスである必要がありL<B>ます。

これはそれほど些細なことではありません。たぶんA、テンプレートが使用できるBいくつかの特性の概念を実装する必要があります。L

template<typename E> struct L : public L< typename E::base >
{
};

struct BASE {};
template<> struct L<BASE> {};

struct A : public BASE {
  typedef BASE base;
};

struct B : public A {
  typedef A  base;
};

編集-http://codepad.org/CT3FvmwQでバージョンをコンパイル

于 2012-09-20T15:24:38.847 に答える