当c++实例化方法?
When c++ instantiating method?
我正在尝试使用 gcc 和 clang 编译此代码:
#include <iostream>
#include <type_traits>
template<int N>
struct Test
{
template<typename = std::enable_if_t<N == 1, bool>>
void func()
{
std::cout << "Test::func" << std::endl;
}
};
int main()
{
Test<0> t;
//t.func();
}
所以,我有一个错误:
error: no type named 'type' in 'std::__1::enable_if<false, bool>'; 'enable_if' cannot be used to
disable this declaration
template <bool _Bp, class _Tp = void> using enable_if_t = typename enable_if<_Bp, _Tp>::type;
但是如果我使用 vc++ 编译该代码,则没有错误。 那么,哪个编译器根据 c++ 标准解决了这个问题呢?
GCC和Clang在这里是正确的。
当您编写Test<0>
时,N
将替换为 0。在func
声明中,std::enable_if_t
将尝试访问不存在的成员::type
。这是一个错误,因为该成员不存在,并且您不能有这样的声明。
SFINAE 的工作方式是,在重载解析期间,当编译器执行模板参数推导时,如果模板中参数的替换失败,则不会收到错误,并且该函数将从潜在的重载集中丢弃。在您的示例中,没有模板参数推导。N 已经从类模板中已知,因此,在重载解析开始之前,func
的声明格式不正确。
您的用例的潜在解决方法是:
template<int M = N, typename = std::enable_if_t<M == 1, bool>>
void func()
{
std::cout << "Test::func" << std::endl;
}
这样,func
现在依赖于函数模板参数,M
,并且 SFINAE 按预期工作。
相关文章:
- 使用动态实例化的对象填充矢量的快速方法
- 检查类是否在方法中实例化
- 从 c++ 中的实例化进程获取输出的可靠方法是什么?
- 使用包含互斥锁的类的方法实例化 cpp11 线程
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- 当c++实例化方法?
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- C++ 实例化新对象时不接受继承方法默认参数值
- 实例化新类时未调用的方法
- 找不到使用 bitset 实例化模板函数的有效方法
- 无法实例化抽象类,但类不是抽象/派生方法的参数
- 有没有一种优雅的方法可以从 std::vector 实例化 boost::array
- 使用类方法而不实例化
- 一种安全、符合标准的方法,使类模板专用化仅在实例化时才无法使用"static_assert"进行编译
- C++17 单独的显式方法模板实例化声明和定义
- 如何实例化多个 set 对象来测试 Set 类的各种构造函数和方法
- 模板类方法的部分专用化或实例化
- 使用自动>decltype方法显式实例化函数
- 隐式模板方法实例化
- 用虚方法实例化类,但不进行堆分配