5

我在面试时遇到了这个问题,但仍然不知道如何解决:

假设我们有一个 C++ 代码:

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

我们应该添加什么才能真正编译?

换句话说,我们应该如何定义L,AB类?请不要使用预处理器的指令。

我只知道如何解决它:

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 回答