C++ C++;构造函数中导致错误的类型特征

C++ C++;构造函数中导致错误的类型特征,c++,sfinae,typetraits,enable-if,C++,Sfinae,Typetraits,Enable If,可能重复: 我希望有一个构造函数,它只接受一个参数,并且仅当该参数的类型具有成员类型::t,该成员类型必须是其他类型的子类型时才启用。我正在为此使用类型特征,代码如下所示: #include <type_traits> struct Y{}; struct X{ //Only allow if T has a type member T::t which is a subtype of Y template <typename T> X(T*

可能重复:

我希望有一个构造函数,它只接受一个参数,并且仅当该参数的类型具有成员类型
::t
,该成员类型必须是其他类型的子类型时才启用。我正在为此使用类型特征,代码如下所示:

#include <type_traits>

struct Y{};

struct X{
    //Only allow if T has a type member T::t which is a subtype of Y
    template <typename T>
    X(T* t, std::enable_if<std::is_base_of<Y, typename T::t>::value, int>::type e = 0){}
};
#包括
结构Y{};
结构X{
//仅当T的类型成员T::T是Y的子类型时才允许
模板
X(T*T,std::enable_if::type e=0){
};
但是,g++抱怨如下:

test/test.cpp:8:75: error: ‘std::enable_if<std::is_base_of<Y, typename T::t>::value, int>::type’ is not a type
test/test.cpp:8:75:错误:“std::enable_if::type”不是类型

我做错了什么?

您必须在
std::enable\u if::type
中添加一个
typename来解决这个问题…

哦,对了,因为::type依赖于模板参数,所以我必须使用typename前缀,对吗?没错。我想,分析类型(
T::T
)中的另一个间接层次也会导致问题。为什么?我在这里使用了typename关键字。