C++ calling template functions of Base class
Below are two cases.
Case 1) Base->BaseIndirect->DerivedIndirect
Case 2) Base->Derived
In Case 2), I am able to call a template function of Base class using 3 notations. In Case 1), I am able to call template function of Base class using only 1 of those notations. And, I am NOT able to call template function of BaseIndirect using any notation :(. How do I fix this? Thanks.
struct Base {
template<bool R> inline void fbase(int k) {};
};
template<class ZZ> struct BaseIndirect : Base {
template<bool R> inline void fbaseIndirect(int k) {};
};
template<class ZZ>
struct DerivedIndirect : BaseIndirect<ZZ> {
DerivedIndirect() {
this->fbase<true>(5); // gives error, line 13
fbase<true>(5); // gives error, line 14
Base::fbase<true>(5); // WORKS, line 15
this->fbaseIndirect<true>(5); // gives error, line 16
fbaseIndirect<true>(5); // gives error, line 17
BaseIndirect<ZZ>::fbaseIndirect<true>(5); // gives error, line 18
}
};
template<class ZZ>
struct Derived : Base {
Derived() {
this->fbase<true>(5); // WORKS
fbase<true>(5); // WORKS
Base::fbase<true>(5); // WORKS
}
};
int main() {
Derived<int> der;
DerivedIndirect<int> derIndirect;
};
ERRORS on compilation
test.cpp: In constructor 'DerivedIndirect<ZZ>::DerivedIndirect()':
test.cpp:14: error: 'fbase' was not declared in this scope
test.cpp:17: error: 'fbaseIndirect' was not declared in this scope
test.cpp: In constructor 'DerivedIndirect<ZZ>::DerivedIndirect() [with ZZ = int]':
test.cpp:34: instantiated from herep
test.cpp:13: error: invalid operands of types '<unresolved overloaded function type>' and 'bool' to binary 'operator<'
test.cpp:16: error: invalid operands of types '<unresolved overloaded function type>' and 'bool' to binary 'operator<'
test.cpp:18: error: invalid operands of types '<unresolved overloaded function type>' and 'bool' to binary 'operator<'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
The reason that many of these calls are failing is that there's a syntactic ambiguity you need to resolve using the single most obscure use of the
template
keyword. Instead of writingYou need to write
The reason is that without the
template
keyword, the compiler parses this asWhich is nonsensical. The template keyword explicitly removes this ambiguity. Adding the
template
keyword into the other cases you mentioned should fix those problems.I'm actually not sure why this works for direct base classes, so if someone could answer that part of the question I'd love to see what the answer is.