std::enable_if 方法可以在类之外定义吗

问题描述 投票:0回答:1

是否存在允许在类外部定义

method1
的语法,或者这对 SFINAE 不友好?

#include <type_traits>

template <int TClass>
struct SampleClass {
    // This definition compiles just fine
    template <int TMethod = TClass>
    typename std::enable_if<TMethod == 0, void>::type
    method0() {}

    // Declaration
    template <int TMethod = TClass>
    typename std::enable_if<TMethod == 1, void>::type
    method1();
};

// This does not compile
template <int TClass>
template <int TMethod = TClass>
typename std::enable_if<TMethod == 1, void>::type
SampleClass<TClass>::method1() {}

int main() { return 0; }

使用GCC 10.2.1,错误:

foo.cpp:20:30: error: default argument for template parameter for class enclosing 'typename std::enable_if<(TMethod == 1), void>::type SampleClass<TClass>::method1()'
   20 | SampleClass<TClass>::method1() {}
      |                              ^
c++ sfinae
1个回答
0
投票

错误消息描述了问题:

foo.cpp:20:30: error: default argument for template parameter for class enclosing 'typename std::enable_if<(TMethod == 1), void>::type SampleClass<TClass>::method1()'
   20 | SampleClass<TClass>::method1() {}
      |       

问题在于默认参数。

template <int TClass>
template <int TMethod /* = TClass*/>
typename std::enable_if<TMethod == 1, void>::type
SampleClass<TClass>::method1() {}

刚刚注释掉了。

C++ 中通常禁止重复默认参数,以避免编译器检查两种情况是否具有相同的值。

© www.soinside.com 2019 - 2024. All rights reserved.