C++ 为什么typename是必需的,即使它似乎足以推断名称应该是一个类型?
我不明白为什么这里需要C++ 为什么typename是必需的,即使它似乎足以推断名称应该是一个类型?,c++,C++,我不明白为什么这里需要typename。因为,编译器不应该推断出值类型是迭代器::值类型?我们将玩一个游戏。这是模板游戏。我给你写了一个函数模板,你告诉我它是做什么的。准备好的走 这个函数的作用是什么 template<typename T> void foo() { T myT{}; } 你注意到了吗?您以为T::thing()会调用一个函数,但现在它只会创建一个int!看看实例化函数的外观: template<> void foo<Bar>()
typename
。因为,编译器不应该推断出值类型是迭代器::值类型?我们将玩一个游戏。这是模板游戏。我给你写了一个函数模板,你告诉我它是做什么的。准备好的走
这个函数的作用是什么
template<typename T>
void foo() {
T myT{};
}
你注意到了吗?您以为T::thing()
会调用一个函数,但现在它只会创建一个int!看看实例化函数的外观:
template<>
void foo<Bar>() {
// thing is not a function, but a member type!
(void) Bar::thing();
}
但编译器在使用依赖名称解析表达式时只需处理这些语法假设。从属babe只是一个包含模板参数的名称
如果您想了解更多关于何时何地放置这些消除歧义的关键字的信息,请阅读以下问题:
template<typename T>
void foo() {
(void) T::thing();
}
struct Bar {
using thing = int;
};
foo<Bar>();
template<>
void foo<Bar>() {
// thing is not a function, but a member type!
(void) Bar::thing();
}
template<typename T>
void foo() {
// I really want T::thing to be a type!
(void) typename T::thing();
}