Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++ 未能在g++/铿锵++;使用std::启用_if_C++_Typetraits_Enable If - Fatal编程技术网

C++ 未能在g++/铿锵++;使用std::启用_if

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

我试着用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 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你应该回答这个问题。