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关键字。