首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么尝试调用带有显式类型参数的模板成员函数时出现错误?

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

Stack Overflow用户
提问于 2011-02-09 16:29:27
回答 1查看 2.7K关注 0票数 75

我不明白,在我看来,对f的调用是完全明确的,但是它不能用expected primary-expression before ‘int’编译。如果我用对f的调用注释掉这行,它编译得很好。

代码语言:javascript
复制
template<typename T>
struct A {
    template<typename S>
    void f() { }
};

template<typename T>
struct B : A<T> {
    void g() {
        this->f<int>();
    }
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-09 16:34:54

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

代码语言:javascript
复制
this->template f<int>();

这类似于typename的奇怪之处,除了应用于函数之外,它还会产生依赖类型。特别是,如果省略了template关键字,

代码语言:javascript
复制
this->f<int>()

(您想要的),以及

代码语言:javascript
复制
((this->f) < int) > ()

这是没有意义的(这就是你的错误)。这里关键字template的使用消除了歧义,并迫使编译器认识到,它看到的是对模板化成员函数的完全有效调用,而不是一大堆乱码。

希望这能有所帮助!

票数 138
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4942703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档