C++ 未能在g++/铿锵++;使用std::启用_if
我试着用msvc编译这个,它编译得很好。另一方面,我没有用g++和clangg++编译它。我得到的错误是在“struct std::enable_if”中没有名为“type”的类型。。如何解决此错误C++ 未能在g++/铿锵++;使用std::启用_if,c++,typetraits,enable-if,C++,Typetraits,Enable If,我试着用msvc编译这个,它编译得很好。另一方面,我没有用g++和clangg++编译它。我得到的错误是在“struct std::enable_if”中没有名为“type”的类型。。如何解决此错误 #include <type_traits> template <bool v> struct a { template <typename T = typename std::enable_if<v>::type> void fu
#include <type_traits>
template <bool v>
struct a {
template <typename T = typename std::enable_if<v>::type>
void function();
};
template struct a<false>;
template struct a<true>;
template<bool v>
template<typename T>
void a<v>::function() { }
int main() {
}
#包括
样板
结构a{
样板
空函数();
};
模板结构a;
模板结构a;
样板
样板
void a::function(){}
int main(){
}
如果传递的
bool
模板是true
您没有正确使用SFINAE,我试图使void函数
可见,因为传递给enable\u的bool
(即v
)不依赖于函数模板参数
有选择地添加或删除类模板成员的规范方法是使用模板专门化。例如:
template <bool v>
struct a {
void function();
};
template< >
struct a<false> {
};
这也可以通过SFINAE实现,但需要一些技巧。如上所述,我们需要使函数
成为一个模板,并且我们需要确保enable_if
中使用的条件取决于其模板参数。由于我们没有任何模板参数,因此需要添加一个虚拟参数:
template <bool v>
struct a {
template<
typename Dummy = void,
typename = typename std::enable_if<
std::is_same< Dummy, Dummy >::value && v
>::type
>
void function();
};
模板
结构a{
模板<
typename Dummy=void,
typename=typename标准::启用\u如果<
std::是否相同::值(&v)
>::类型
>
空函数();
};
这里,当计算enable\u if
的第一个模板参数时,我们使用is\u same
trait引入对Dummy
模板参数的形式依赖。当然,的结果是相同的
将是真的
,因此有效地v
决定了函数
模板是否可以实例化。您没有正确地使用SFINAE,因为您传递给bool
的是enable\u if
(即v
)不依赖于函数模板参数
有选择地添加或删除类模板成员的规范方法是使用模板专门化。例如:
template <bool v>
struct a {
void function();
};
template< >
struct a<false> {
};
这也可以通过SFINAE实现,但需要一些技巧。如上所述,我们需要使函数
成为一个模板,并且我们需要确保enable_if
中使用的条件取决于其模板参数。由于我们没有任何模板参数,因此需要添加一个虚拟参数:
template <bool v>
struct a {
template<
typename Dummy = void,
typename = typename std::enable_if<
std::is_same< Dummy, Dummy >::value && v
>::type
>
void function();
};
模板
结构a{
模板<
typename Dummy=void,
typename=typename标准::启用\u如果<
std::是否相同::值(&v)
>::类型
>
空函数();
};
这里,当计算enable\u if
的第一个模板参数时,我们使用is\u same
trait引入对Dummy
模板参数的形式依赖。当然,的结果是相同的
将是真的
,因此有效地v
决定了函数
模板是否可以实例化。您没有正确使用SFINAE,因为v
不依赖于函数
模板参数。你想做什么?如果传递的bool模板为true,我想让void函数
可见。所以template std::enable_if_t function()代码>或模板无效函数()代码>,如果您愿意的话。只需进行显式专门化<代码>模板结构a{void function();};模板结构a{}
@max66您应该回答这个问题。您没有正确使用SFINAE,因为v
不依赖于函数
模板参数。你想做什么?如果传递的bool模板为true,我想让void函数
可见。所以template std::enable_if_t function()代码>或模板无效函数()代码>,如果您愿意的话。只需进行显式专门化<代码>模板结构a{void function();};模板结构a{}代码>@max66你应该回答这个问题。