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

如何在类声明之外定义sfinae类的成员?

倪鸿禧
2023-03-14

在阅读了诸如sfinae关于在类主体之外定义的成员函数(这不是同一个问题)等问题之后,我仍然没有找到在使用sfinae方法仅使用算术类型启用类时在类声明之外定义成员函数主体的好方法。

#include <type_traits>

template <typename T,typename = typename std::enable_if<std::is_arithmetic<T>::value,T>::type>
class foo
{
public:
    void bar();
};

template <typename T>
void foo<T>::bar ()
{
}

在本例中,我得到错误:

error: invalid use of incomplete type 'class foo<T>'
void foo<T>::bar ()
^
error: declaration of 'class foo<T>'
class foo
^
#include <type_traits>

template <typename T,typename = typename std::enable_if<std::is_arithmetic<T>::value,T>::type>
class foo
{
public:
    void bar()
    {
    }
};

共有1个答案

翁俊良
2023-03-14

foo有两个模板参数,即使其中一个是未命名的、默认的并用于sfinae。因此:

template <typename T, typename U>
void foo<T, U>::bar ()
{
}
 类似资料:
  • 其中T是模板参数。它是这样实现的: 并按预期工作。当我试图将和的定义移到类体之外时,问题就出现了,如下所示: 在箭头标记的一行表达了它的不满:

  • 问题内容: 我可以在类定义之外创建,甚至可以在另一个模块中创建吗? 问题答案: 是。您可以在类外部定义函数,然后在类主体中将其用作方法: 您也可以在定义一个函数后将其添加到类中: 您可以根据需要在不同的模块中定义函数和类,但是我建议不要在一个模块中定义该类,然后再将其导入另一个模块中并向其中动态添加方法(如第二个示例),因为那样的话d根据是否已导入另一个模块,其行为与类具有令人惊讶的不同。 我要指

  • 我有以下C 11代码(简化版): GCC 4.9.1可以很好地编译和链接此代码。另一方面,Clang 3.5.0抱怨未定义的引用: 哪个是对的?这个代码合法吗?我对静态Constexr成员规则的理解(主要基于这个问题)是,只有在获取变量的地址时才需要类外定义。但是我没有将Deriv的地址ed::信息或在任何地方使用对它的引用;我只是按值将它传递给Base构造函数。 我发现了各种变通方法: 使两个构

  • 关于我的问题 我有一个模板类,如下所示: 所以简而言之,我想要的是:1。在类外部的容器类型上编写泛型函数模板。2.类中函数的原型是什么? 请建议

  • 本文向大家介绍如何使用JSP声明来声明类的对象?,包括了如何使用JSP声明来声明类的对象?的使用技巧和注意事项,需要的朋友参考一下 声明声明了一个或多个变量或方法,您可以稍后在JSP文件中的Java代码中使用它们。在JSP文件中使用变量或方法之前,必须先声明该变量或方法。 以下是JSP声明的语法- 您可以编写与上述语法等效的XML,如下所示- 以下是JSP声明中对象声明的示例-