模板化类:访问派生的普通类方法

时间:2012-09-08 02:32:52

标签: c++ templates inheritance

我有这样的事情:

class Container1 {
  public:
    method1() { ... }
}
class Container2 {
  public:
    method1() { ... }
}

template<class C = Container1>
class X : public C {
  public:
    using C::method1();
    .....
    X(string& str) : C(str) {};
    X& other_method() { method1(); ...; }
}

我的问题是为什么我必须使用“使用C :: method1()”才能访问该方法.. 我发现的大多数答案都是针对模板类继承模板化类的情况。通常他们提到使用“this-&gt;”,但在这种情况下这似乎不起作用。 我能做些其他更短的事吗......

此外,我怀疑我遇到的另一个错误与同样的问题有关:

no match call for (X<Container1>) (<std::string&>)

2 个答案:

答案 0 :(得分:1)

首先,在ctor的定义中,您不应该使用<C>。这很可能会让编译器感到困惑:

template<class C = Container1>
class X : public C 
{
    X(string& str) : C(str) { }
    X& other_method() { method1(); ...; }
}

其他一点是,编译器可能不确定应该调用什么:base_class::method1()template_param::method1()。实际上这是相同的事情,但编译器可能有一个问题理解这一点。如果不同的编译器在这里采取不同的行为,我不会感到惊讶。

这些是我没有进行测试的2美分。

答案 1 :(得分:1)

调用this->method1()可能会失败,因为Container1::method1Container2::method1是私有的。您可以通过执行以下操作来解决此问题:

class Container1 {
public:
    void method1() { ... }
};

然后,回到“为什么我必须在调用模板基类中定义的方法时使用usingthis->?”,答案是method1这里是依赖名称,因为它取决于模板参数C。因此,您需要告诉编译器“嘿,您看到这个method1调用了吗?那么,该符号应该在我继承的模板类中定义。”

由于编译器在您实际实例化类模板之前不知道您继承了什么,因此必须指明该成员函数应该由该模板参数定义。否则,编译器将看到对非限定函数的调用,并将生成错误,因为在类X中找不到名为“method1”的方法。

This线程包含有关依赖名称的一些信息。

代码中的另一个错误是构造函数:

X<C>(string& str) : ...

该代码格式错误。应该以这种方式定义类X的构造函数构造函数:

X(string& str) : ....