指向具有不同模板参数的类模板的指针

Sas*_*aka 5 c++ templates pointers

我在采访中得到了这个问题,但仍然不知道如何解决这个问题:

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

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

我们应该添加什么以便实际编译?

换句话说,我们应该如何界定L,A以及B类?请不要使用预处理程序的指令.

我只知道如何解决它:

template<class T> struct L {};
struct A {};
typedef A B;
Run Code Online (Sandbox Code Playgroud)

甚至更简单的前向声明:

struct A;
typedef A B;
template<class> struct L;
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?

Luc*_*ore 9

没有预处理器指令:

/* <-- added line

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

    return 0;
}

*/ //<-- added line

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

对我来说很好.

  • @ValentinKuzub如果我在面试时被问到这个问题,我会问他们是否真的写了这样的代码.如果他们这样做了,我就离开了. (6认同)

Gor*_*pik 6

简单的出路:专门L<>从而L<B>继承自L<A>:

template<>
struct L<B> : public L<A> {};
Run Code Online (Sandbox Code Playgroud)


xto*_*ofl 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;
};
Run Code Online (Sandbox Code Playgroud)

编辑 - 在http://codepad.org/CT3FvmwQ上编译versio