C ++ 17调用不带尖括号的模板类的静态方法

问题描述

在C ++ 17中,声明实例时可以省略尖括号<>。但是为什么从模板类调用静态方法时仍需要它们呢?

#include <iostream>

using namespace std;

template<typename T = void> struct A
{
    static const int i = 10;
};

int main() {
    A a; // compile
    int i = A::i; // does not compile
    return 0;
}

解决方法

因为语言功能(Class template argument deduction)仅涉及构造对象。它基于带有构造函数和推论指南的重载解析。

对于静态数据成员,这将是一个非常有限的功能-只有在所有模板参数都默认情况下,它才可能工作,此时您仅保存两个字符(因为A::i仅可以保存推导为A<>::i)。

假设使用静态成员函数,它可能会更有趣(因为成员函数可以满足与构造函数相同的目的),但由于必须在每个作用域上基本执行该步骤,因此会使作用域查找复杂化。

但是无论如何,CTAD只适用于构造对象,因为那是它试图解决的问题,并且这是它唯一要解决的问题。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...