指向实现模式的指针

时间:2013-01-27 11:25:04

标签: c++ templates c++11

我正在尝试使用模板类实现指向实现模式的指针,并且为了创建独立的类及其实现,我使用下一种方法:

template<typename T>
struct __A_impl;

template<typename T>
struct A
{
    using __impl_t = __A_impl<T>;

    A(__impl_t* t);

    __impl_t* _t;
};

template<typename T>
struct B
{
    T _t;
};

template<typename T>
using __A_impl = B<T>;

使用这个表单,如果我想更改'B'的名称,这不会以任何方式影响A的定义。但是,我收到gcc的下一个错误:

test.cpp:21:22: error: declaration of template 'template<class T> using __A_impl =    B<T>'
test.cpp:2:7: error: conflicts with previous declaration 'template<class T> class __A_impl'
test.cpp:21:22: error: redeclaration of 'template<class T> using __A_impl = B<T>'
test.cpp:2:7: note: previous declaration 'template<class T> class __A_impl'

我怎样才能做到这一点?因为使用typedef声明符是不可能的。

2 个答案:

答案 0 :(得分:2)

您无法转发声明typedef。你只能转发声明类/结构/枚举。

此外,PIMPL通常用于防止编译器看到实现,但在您的情况下,由于它是模板,因此永远不会发生,所以我不明白这一点。

答案 1 :(得分:0)

嗯,这可以编译,虽然它可能不是你想要的:

template<typename T>
struct B
{
    T _t;
};

template<typename T>
using __A_impl = B<T>;

template<typename T>
struct A
{
    using __impl_t = __A_impl<T>;

    A(__impl_t* t);

    __impl_t* _t;
};

无论如何,有两件事:

  1. 为什么不使用std::unique_ptr
  2. 保留双下划线用于实施。不要使用它们。