以下列方式using SFINAE with functions/function members时:
#include <type_traits>
#include <iostream>
#include <cstdlib>
struct X {};
struct A
{
template< typename T >
auto
f(T && x)
-> std::enable_if< std::is_same< T, X >::value >::type
{
return x;
}
};
int main()
{
return EXIT_SUCCESS;
}
我收到错误:
main.cpp:14:8: error: expected type-specifier
-> std::enable_if< std::is_same< T, X >::value >::type
^
main.cpp:14:8: error: expected initializer
因此我应该在typename
关键字前面加上启用码。但这里没有任何含糊之处:因为我现在只在->
之后输入预期。另一个值得思考的提示是 Qt Creator 在这种情况下typename
关键字的不足。
这是 G ++ 错误吗?或者在C ++ 11中声称有typename
这样的上下文?
答案 0 :(得分:6)
每次访问依赖类型名称(嵌套在依赖于模板参数的表达式中的类型名称)时,都需要使用typename
关键字。在这种情况下,我很确定你是对的,没有歧义,但如果我没记错,这就是语言的定义方式。
希望这有帮助!
答案 1 :(得分:5)
但这里根本没有歧义:因为我现在只在 - &gt;
之后键入预期
这不是真的如何运作。
同样,在以下声明中只需要一种类型:
T::some_member x;
但是typename
依赖时仍然需要T
,以满足某些编译阶段。
编译器知道这是一个声明(在决定它是否有效之前),直到它看到你有一个->
后跟一个类型。因此,如果它不知道你有一个类型,它不知道“没有歧义”。这是一个鸡蛋问题。