模板化代理设计模式

Jac*_*ian -2 c++ templates declaration forward-declaration

我有一个简单且可重现的代码,看起来像这样:

template <typename T>
class Proxy {
private:
    Wrap<T> &self; // If I comment this, it will work
public:
    Proxy() {}
};

template <typename T>
class Wrap {
    T *p;
public:
    Proxy<T> foo() {
        return Proxy<T>();
    }
};

int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

'Wrap'没有命名类型

如果我评论Wrap<T> &self,那么它会起作用,但这不是我需要的.我需要Wrap<T>成为Proxy班上的一员.我怎样才能做到这一点?

son*_*yao 5

你可以添加向前声明Wrap的类定义之前Proxy,否则编译器无法知道它是一个类模板的名称.值得注意的是,引用数据成员不要求类型是完整类型,因此前向声明就足够了.

// forward declaration
template <typename T>
class Wrap;

template <typename T>
class Proxy {
private:
    Wrap<T> &self;
public:
    Proxy() {}
};
Run Code Online (Sandbox Code Playgroud)

顺便说一句,以下问题self是未初始化参考数据成员.

现场演唱

错误:'Proxy'的构造函数必须显式初始化引用成员'self'