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

时间:2017-01-17 23:28:31

标签: c++11 templates sfinae

在阅读sfinae on member function defined outside of class body之后的问题(这是不一样的问题)和其他问题之后,我仍然没有在使用a时在类声明之外定义成员函数体的好方法SFINAE方法仅使用算术类型启用类。

std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds>

在此示例中,我收到错误:

#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
^

它可以毫无困难地运作。

我正在使用mingw-w64(w64 3.3)编译此代码。

1 个答案:

答案 0 :(得分:2)

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

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