我有这样的事情:
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&>)
答案 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::method1
和Container2::method1
是私有的。您可以通过执行以下操作来解决此问题:
class Container1 {
public:
void method1() { ... }
};
然后,回到“为什么我必须在调用模板基类中定义的方法时使用using
或this->
?”,答案是method1
这里是依赖名称,因为它取决于模板参数C
。因此,您需要告诉编译器“嘿,您看到这个method1
调用了吗?那么,该符号应该在我继承的模板类中定义。”
由于编译器在您实际实例化类模板之前不知道您继承了什么,因此必须指明该成员函数应该由该模板参数定义。否则,编译器将看到对非限定函数的调用,并将生成错误,因为在类X
中找不到名为“method1”的方法。
This线程包含有关依赖名称的一些信息。
代码中的另一个错误是构造函数:
X<C>(string& str) : ...
该代码格式错误。应该以这种方式定义类X
的构造函数构造函数:
X(string& str) : ....