Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么typename是必需的,即使它似乎足以推断名称应该是一个类型?_C++ - Fatal编程技术网

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();
}