0

我有这样的事情:

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->”,但这在这种情况下似乎不起作用。我可以做一些更短的...

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

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

2 回答 2

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 美分。

于 2012-09-08T02:52:13.317 回答
1

呼叫this->method1()可能会失败,因为Container1::method1并且Container2::method1是私人的。您可以通过以下方式解决此问题:

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

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

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

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

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

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

该代码格式不正确。类X的构造函数构造函数应该这样定义:

X(string& str) : ....
于 2012-09-08T02:57:16.057 回答