gpt4 book ai didi

c++ - 将自身传递给其他类的构造函数的类,两者均使用模板定义

转载 作者:太空狗 更新时间:2023-10-29 23:00:03 24 4
gpt4 key购买 nike

A(或其特化)应该创建类B(或其特化)的实例,其中后者有一个字段来知道是谁创建的。以下代码隔离了问题:

template <typename R>
class A {
public:
R make() { return R(this); }
};

template <typename S>
class B {
public:
S * s;
B(S * s_) : s(s_) { }
};

挑战在于模板参数的循环依赖性。一种解决方案出现在前向声明中:

class specB;
typedef A<specB> specA;
class specB : public B<specA> { using B::B; };

据我所知,这工作正常(在程序的其余部分使用 specAspecB)。但是,以下内容(缺少的using 不负责任,上面我只包含了它,以便找到B 的扩展构造函数):

class specA;
typedef B<specA> specB;
class specA : public A<specB> { };

它给出:

In instantiation of ‘R A<R>::make() [with R = B<specA>]’:
required from here
error: invalid conversion from ‘A<B<specA> >* const’ to ‘specA*’ [-fpermissive]
R make() { return R(this); }
^
error: initializing argument 1 of ‘B<S>::B(S*) [with S = specA]’ [-fpermissive]
B(S * s_) : s(s_) { }
^

有没有可能让它也以这种方式工作(没有 -fpermissive)?

更新:这是一个可能的解决方案(似乎可行),但我觉得不合适:

template <typename S>
class B {
public:
S * s;
B(void * s_) : s(static_cast<S*>(s_)) { }
};

最佳答案

当通过派生类调用基类的方法时,该方法获得 this作为指向基类的指针。基类的实现不知道从它派生的类。

在第二个例子中 class A<B<specA>>创建了一个类 specA继承它。当您调用 specA.make()它叫B<specA>(this)this类型 A<B<specA>>* .编译器提示为 B<specA> 的构造函数期望类型为 specA* 的参数.没有从基类指针到派生类指针的简单转换。

你可以这样做:

template<typename T>
class Alloc
{
public:
T make() { return T(*this); }
};

template<template<typename> class A>
class Type
{
private:
A<Type>* a_;

public:
Type(A<Type>& a): a_(&a) { }
};

Alloc<Type<Alloc>> a;
Type<Alloc> t(a);

关于c++ - 将自身传递给其他类的构造函数的类,两者均使用模板定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34839525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com