为什么尝试使用显式类型参数调用模板成员函数时会出现错误?

发布于 2024-10-16 23:46:18 字数 315 浏览 0 评论 0原文

我不明白,在我看来,对 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苏大泽ㄣ 2024-10-23 23:46:18

这是由于该标准的一个非常模糊的规定,其中如果您有一个模板尝试访问其类型取决于模板参数的对象中的模板函数,则必须使用 template 关键字以一种奇怪的方式:

this->template f<int>();

这类似于 typename 带来依赖类型的怪异,除了应用于函数之外。特别是,如果您省略 template 关键字,则

this->f<int>()

(您的意图)之间存在解析歧义,而

((this->f) < int) > ()

这是没有意义的(因此您的错误)。此处使用关键字 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->template f<int>();

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 the template keyword, there's a parsing ambiguity between

this->f<int>()

(what you intended), and

((this->f) < int) > ()

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文