当前位置: 首页 > 知识库问答 >
问题:

C++模板sfinae错误

樊腾
2023-03-14

我有下面的代码,我希望TestEnableIf与不同的专门化有不同的打印功能,但它没有按计划工作,错误如下。

struct myStruct;
struct notMyStruct;

template<typename T> struct TestEnableIf
{
        template<typename boost::enable_if< boost::is_same<myStruct, T>, int >::type = 0> void print()
        {
            std::cout << "this is my struct" << std::endl;
        }

        template<typename boost::enable_if< boost::is_same<notMyStruct, T>, int>::type=0> void print()
        {
            std::cout << "This is not my struct" << std::endl;
        }


};

static void testIsSame()
{

    TestEnableIf<myStruct> testEnable;
     testEnable.print();
     TestEnableIf<notMyStruct> testNotEnable;
     testNotEnable.print();
}

我不明白的是,sfinae应该意味着专门化失败不是错误,那么编译器为什么要抱怨失败?

共有1个答案

井学
2023-03-14

成员函数的SFINAE(顺便说一句,S是“替换”,而不是“专门化”)对类类型参数不是这样工作的。一个简单的方法是使用另一个模板参数:

template<
    typename TCopy = T
    typename boost::enable_if< boost::is_same<myStruct, TCopy>, int >::type = 0
> void print()
{
    std::cout << "this is my struct" << std::endl;
}

我从STL的CppCon演讲中找到的。tl;dw:当使用类的t类型参数时,编译器在实例化类模板时知道该类型是什么,并在该时间点检查type成员。由于额外的tcopy类型参数是函数的本地参数,编译器在实例化函数之前无法确定,此时SFINAE可以跳入以影响调用的重载集。

 类似资料:
  • 我正在尝试为自定义模板类创建一个加法运算符,其中第一个参数可以是我的类的实例,也可以是基本的数字类型。My operator的定义类似于下面的示例代码: 我的预期是,由于SFINAE,试图用

  • 对于将SFINAE与可变模板类一起使用,我似乎找不到一个好的解决方案。 假设我有一个不喜欢引用的可变参数模板对象: 以及一个类,可以方便地检查参数包是否包含引用: 我如何使用它来专门化NoRef的情况下,引用存在于arg包?

  • 我一直试图理解C++选择模板的方式。即,考虑以下代码示例: 前两个函数(test1)工作正常(为什么?): 一个常见的错误是声明两个仅在默认模板参数上不同的函数模板。这是非法的,因为默认模板参数不是函数模板签名的一部分,并且用相同的签名声明两个不同的函数模板是非法的。 所以看起来是这样的。但是,我看不出与前两个函数有太大的不同,前两个函数也有默认的模板参数。因此,我们对默认值(test1-work

  • 我有以下代码使用可变参数模板来调用std::async, 但我收到以下编译错误消息: 没有用于调用“async(std::launch,bool (TestChild:: 我认为这可能与我传递其他参数以及参数包的事实有关。任何人都知道这有什么问题,我应该做些什么来让它发挥作用?

  • 模板是泛型编程的基础,它涉及以独立于任何特定类型的方式编写代码。 模板是用于创建泛型类或函数的蓝图或公式。 像迭代器和算法这样的库容器是通用编程的示例,并且是使用模板概念开发的。 每个容器都有一个定义,例如vector ,但我们可以定义许多不同类型的向量,例如vector 《int》或vector 《string》 。 您可以使用模板来定义函数和类,让我们看看它们是如何工作的 - 功能模板 此处显

  • 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。 每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>。 您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。 函数模板 模