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

标签 c++ templates metaprogramming

我不明白,在我看来,对 f 的调用是完全明确的,但它无法使用 expected primary-expression before 'int' 进行编译>。如果我用对 f 的调用注释掉该行,它编译得很好。

template<typename T>
struct A {
    template<typename S>
    void f() { }
};

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

最佳答案

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

this->template f<int>();

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

之间存在解析歧义
this->f<int>()

(你想要的),和

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

这没有任何意义(因此你的错误)。此处使用关键字 template 可以消除歧义并强制编译器识别它正在查看对模板化成员函数的完全有效调用,而不是一堆乱码。

希望这会有所帮助!

关于c++ - 为什么尝试使用显式类型参数调用模板成员函数时会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4942703/

相关文章:

c++ - 如何使用 GCC 12.1 生成 C++23 堆栈跟踪?

c++ - 不存在从 LoadTask::MasterFilePtr 到 MasterFile * 的合适转换函数

c++ - 不同类型之间的模板类分配

c++ - 如何将具有不同第二种类型的可变数量的 `std::pair` 传递给函数

c++ - 一整套参数的模板特化

解析函数中某些表达式的 Python 装饰器

c++ - GCC 编译器上 bool 类型的 C 和 C++ 语言的默认初始值设定项是 64 而不是 0。这是编译器错误?

C++ 函数返回 NULL 字符串引用

C++11 元编程 - 在编译期间查找枚举值(值包含间隙)

用于 XML 解析的 Python 元编程