문제

아래 코드는 괜찮습니다.

template <class T>
std::enable_if<std::is_atomic<T>::value, bool>
foo(T t) { return true; }

template <class T>
std::enable_if<tmp::is_sequence<T>::value, bool>
foo(T t) { return false; }

int main(void){
  foo(1);  // return true
  auto std::vector<int> a{2};
  foo(a);  // return false
}

그러나 클래스를 사용하여 묶을 때는 컴파일 할 수 없습니다.

template <class T>
class test {
public:

std::enable_if<std::is_atomic<T>::value, bool>
foo(T t) { return true; }

std::enable_if<tmp::is_sequence<T>::value, bool>
foo(T t) { return false; }
};

int main(...) {
  test<int> obj;
  obj.foo(1);
  test<std::vector<int>> obj2;
  std::vector<int> tmp{2};
  obj2.foo(tmp);
}

Clang ++ 인쇄 :

error: functions that differ only in their return type cannot be overloaded

그래서 나는 컴파일러에 속임수를 쓰기 위해 무언가를 씁니다 (S를 두 번째로 추가하십시오. foo):

template <class S>
std::enable_if<tmp::is_sequence<T>::value, bool>
foo(T t) { return false; }

여전히 작동 할 수 없습니다.

error: no type named 'type' in 'std::enable_if<false, bool>'

수업에서 어떻게 작동하게 할 수 있습니까?

도움이 되었습니까?

해결책 2

두 멤버 기능 모두 다른 템플릿 매개 변수가 있어야합니다 (다음은 작동합니다).

template <class T>
class test {
public:

template<typename U>
typename std::enable_if<std::is_atomic<U>::value, bool>::type
foo(U t) { return true; }

template<typename U>
typename std::enable_if<tmp::is_sequence<U>::value, bool>::type
foo(U t) { return false; }

};

다른 팁

당신은 추가하는 것을 잊었습니다 ::유형 ~ 후에 enable_if: (보다 enable_if)

template <class T> std::enable_if<std::is_atomic<T>::value, bool>::type
foo(T t) { return true; }

당신이하고있는 일을 정말로하고 싶다면, 고전적인 관용구는 기본 가치를 가진 가짜 sfinae 논쟁을 소개하는 것입니다.

bool foo(T t, std::enable_if<..., void*> = nullptr) { ... }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top