为什么在这种情况下我需要 .template
Why do I need .template in this case
template<typename T>
struct Obj
{
template<typename U>
void m(){};
};
template<typename T>
void func()
{
Obj<T> v; // Obj<int> v; is compilable
v.m<int>();
}
这段代码给了我一个错误:
test.cpp: In function ‘void f()’:
test.cpp:21:9: error: expected primary-expression before ‘int’
v.m<int>();
^
test.cpp:21:9: error: expected ‘;’ before ‘int’
但是,如果我将Obj<T> v;
更改为Obj<int> v;
,它将是可编译的。
我不知道为什么。
使用
v. template m<int>();
来自 C++ 17 标准(17.2 模板专业化名称(
4 关键字模板据说出现在 限定 ID(如果它出现在模板参数列表之外(或 描述类型说明符。在声明符 id 的限定 id 中或在 由类头名(第 12 条(或枚举头名组成的限定 id (10.2(、关键字模板不得出现在顶层。在一个 限定 ID 用作类型名称说明符 (17.6( 中的名称, 详细类型说明符 (10.1.7.3(、使用声明 (10.3.3( 或 class-or-decltype(第 13 条(,出现一个可选的关键字模板 在顶层被忽略。在这些上下文中,<令牌始终>在所有其他 上下文,当命名模板时 未知特化(17.6.2.1(,成员模板名称应为 关键字模板为前缀令牌始终>
相关文章:
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 在这种情况下,java对象是否可以调用本机函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 在这种情况下,我真的复制了字节还是复制了字符?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 在这种情况下,如何传递成员函数而不是函数?
- 为什么在这种情况下递增阵列名称有效?
- 在这种情况下我应该使用哪种设计模式
- 为什么在这种情况下我需要 .template
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 在这种情况下,"typename..."意味着什么?
- 为什么在这种情况下 x = 44?
- 在这种情况下是私有的吗?试图使操作员<<过载
- 在这种情况下,如何防止C++输出/控制台窗体关闭
- 为什么 lambda nullptr 取消引用在这种情况下有效?
- 为什么在这种情况下,前向声明不起作用?
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在这种情况下,为什么模板即时深度超过限制?
- 在这种情况下,当尝试从单独的类更新变量时,我是否需要使用指针?