首页 > 解决方案 > 从非模板类调用专门的模板方法

问题描述

我无法在非模板类的专用模板类中调用方法。

我有一个如下模板类:

template<class T>
class Builder{

   Builder() { t = new T; }
   Builder &setName(const int &name);
   // other methods
   T &build();

protected:
    T *t;

}

template<class T>
T &Builder<T>::build() {
    return *t;
}

// other implementations

我有一个从专门的模板类继承的类

class SomeClass;

//template<class T>
class SomeClassBuilder : public Builder<SomeClass> {

public:
    SomeClassBuilder() : Builder<SomeClass>() {}
    SomeClassBuilder &setAge(int age);
}
class SomeClass{
public:
    static SomeClassBuilder createExperiment(){
      return {};
    }
// other methods
}

但是,当我尝试根据链接方法调用的方式使用此 SomeClassBuilder 时,有时会出现错误。下面的代码片段给出了一个错误(has no member named setAge)。

SomeClass::Engine()
            .setName("Name")
            .setAge(109)
            .build();

像下面这样链接方法调用不会出错,因为类的setAge方法SomeClass在模板类之前。

SomeClass::Engine()
            .setAge(109)
            .setName("Name")
            .build();

标签: c++builder

解决方案


您的问题是引用SomeClassBuilder &可以解释为Builder<SomeClass> &但不能反过来(因为您需要动态转换)。由于Builder<T>return a Builder<T> &this 的方法确实没有set_age成员。这对于模板没有问题,但对于继承。

我看到了 3 个解决方案:

  1. 总是set_age先使用,而函数应用的类型仍然是SomeClassBuilder &.
  2. 覆盖所有函数,SomeClassBuilder使它们执行基类中的方法,然后*thisSomeClassBuilder &.
  3. 使用CRTP,因此向基类添加一个模板参数,该参数class Child获取继承的 Child 的类型,并让所有方法返回Child &,而不是返回之前Builder &必须dynamic_cast this返回。然后SomeClassBuilder应该继承自Builder<T, SomeClassBuilder>(需要前向声明)。

另外:不要使用原始指针来拥有内存。代码中的原始new代码不是一个好兆头。改为使用std::unique_ptr


推荐阅读