1
클래스 외부의 템플릿 클래스에 템플릿 멤버 함수를 정의하고 SFINAE를 사용하여 함수를 부분적으로 오버로드합니다. 내가 노력하고 무엇을 최소한의 예는 다음과 같습니다C++ 템플릿 enable_if 기존 정의에 함수 정의를 일치시킬 수 없습니다.
Test.h :
template<typename T, size_t D>
class Test
{
public:
Test(){}
~Test(){}
template<size_t W = D, typename = int*>
void do_something(Test&);
private:
T data[D];
};
#include <type_traits>
template<typename T, size_t D>
template<size_t W, typename std::enable_if<W == 2, int>::type* = 0>
inline void Test<T, D>::do_something(Test &)
{
exit(2);
}
template<typename T, size_t D>
template<size_t W, typename std::enable_if<W == 3, int>::type* = 0>
inline void Test<T, D>::do_something(Test &)
{
exit(3);
}
하여 Main.cpp : C2244 '테스트 : do_something :
int main(int, char**) {
Test<float, 2> t1;
Test<float, 2> t2;
t1.do_something(t2);
return 0;
}
그러나이 코드 샘플에서는 오류가 발생합니다 ': 함수 정의를 기존 선언과 일치시킬 수 없습니다. 내가
template<size_t W, typename Type>
에
template<size_t W, typename std::enable_if<W == 2, int>::type* = 0>
을 변경 한 후 문제없이 컴파일 코드를 do_something의 다른 정의를 제거하면 그래서 나는 enable_if는 문제가 있음을 알고있다. 그래서 문제는 : 클래스 내에서 함수를 정의하지 않고 부분적인 오버로드 효과를 얻기 위해 enable_if를 사용하려면 어떻게해야합니까?
내가 MSVS 2015
당신은 또한'표준 : enable_if'을 사용해야합니다 선언. – Jarod42
그래서, 귀하의 경우, 당신은 단지 과부하를 사용할 수 있습니다. – Jarod42