为什么尝试使用显式类型参数调用模板成员函数时会出现错误?
我不明白,在我看来,对 f 的调用是完全明确的,但它无法使用“int”之前的预期主表达式进行编译。如果我注释掉调用 f
的行,它可以正常编译。
template<typename T>
struct A {
template<typename S>
void f() { }
};
template<typename T>
struct B : A<T> {
void g() {
this->f<int>();
}
};
I don't get it, it seems to me that the call to f
is completely unambiguous, but it fails to compile with expected primary-expression before ‘int’
. If I comment out the line with the call to f
, it compiles fine.
template<typename T>
struct A {
template<typename S>
void f() { }
};
template<typename T>
struct B : A<T> {
void g() {
this->f<int>();
}
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是由于该标准的一个非常模糊的规定,其中如果您有一个模板尝试访问其类型取决于模板参数的对象中的模板函数,则必须使用
template
关键字以一种奇怪的方式:这类似于
typename
带来依赖类型的怪异,除了应用于函数之外。特别是,如果您省略template
关键字,则(您的意图)之间存在解析歧义,而
这是没有意义的(因此您的错误)。此处使用关键字
template
可以消除歧义,并强制编译器认识到它正在查看对模板化成员函数的完全有效的调用,而不是一堆乱码。This is due to a really obscure provision of the standard in which if you have a template that tries to access a template function in an object whose type depends on a template argument, you have to use the
template
keyword in a weird way:This is similar to the weirdness with
typename
that comes up with dependent types, except as applied to functions. In particular, if you leave out thetemplate
keyword, there's a parsing ambiguity between(what you intended), and
which makes no sense (hence your error). The use of the keyword
template
here disambiguates and forces the compiler to recognize that it's looking at a perfectly valid call to a templated member function rather than a garbled mass of symbols.