2016-07-15 2 views
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

+0

당신은 또한'표준 : enable_if'을 사용해야합니다 선언. – Jarod42

+0

그래서, 귀하의 경우, 당신은 단지 과부하를 사용할 수 있습니다. – Jarod42

답변

1

로 컴파일하고 있음을 추가해야합니다 당신은 선언에서 또한 std::enable_if을 사용해야합니다 :

template<typename T, std::size_t D> 
class Test 
{ 
public: 
    template<std::size_t W, typename std::enable_if<W == 2>::type* = nullptr> 
    void do_something(Test<T, W> &); 

    template<std::size_t W, typename std::enable_if<W == 3>::type* = nullptr> 
    void do_something(Test<T, W> &); 
}; 



template<typename T, std::size_t D> 
template<std::size_t W, typename std::enable_if<W == 2>::type*> 
void Test<T, D>::do_something(Test<T, W> &) 
{ 
    std::cout << 1 << std::endl; 
} 

template<typename T, std::size_t D> 
template<std::size_t W, typename std::enable_if<W == 3>::type*> 
void Test<T, D>::do_something(Test<T, W> &) 
{ 
    std::cout << 2 << std::endl; 
} 

Demo

관련 문제