중첩 클래스 (MSVC 컴파일러 버그 또는 기능)를 사용하여 Strange Enable_if 동작
-
13-09-2020 - |
문제
꽤 많은 시간이 내 코드를 디버깅 한 후에는 Enable_if를 사용하여 예기치 않은 템플릿 전문화 결과에 대한 내 문제가 발생한 이유를 추적했습니다.
다음 코드는 Visual Studio 2010 (및 2008)에서 dotest ()에서 어설 션이 실패하고 있으며 G ++ 3.4.5가 아닙니다. 그러나 someclass 에서 템플릿을 제거하거나 my_condition 을 someclass 밖으로 이동합니다.
는 작동합니다.이 코드 가이 동작 (적어도 부분적으로) 설명하는이 코드가 잘못되었거나 MSVC 컴파일러의 버그입니까?
(이 예제 코드 사용)
부스트 및 C ++ 0x STL 버전에 대해 동일합니다.#include <cassert>
#include <boost\utility\enable_if.hpp>
template <class X>
class SomeClass {
public:
template <class T>
struct my_condition {
static const bool value = true;
};
template <class T, class Enable = void>
struct enable_if_tester {
bool operator()() { return false; }
};
template <class T>
struct enable_if_tester<T, typename boost::enable_if< my_condition<T> >::type> {
bool operator()() { return true; }
};
template <class T>
void DoTest() {
enable_if_tester<T> test;
assert( test() );
}
};
int main() {
SomeClass<float>().DoTest<int>();
return 0;
}
.
STD :: ENABLE_IF를 사용할 때이 조건을 옮길 때도 충분하지는 않지만 적어도 BOOST :: ENALL_IF :
에서 작동하는 것도 충분히 작동하지 않는다는 점을 알아 차렸다.#include <cassert>
//#include <boost\utility\enable_if.hpp>
#include <type_traits>
template <class T, class X>
struct my_condition {
static const bool value = true;
};
template <class X>
class SomeClass {
public:
template <class T, class Enable = void>
struct enable_if_tester {
bool operator()() { return false; }
};
template <class T>
//struct enable_if_tester<T, typename boost::enable_if< my_condition<T, X> >::type> {
struct enable_if_tester<T, typename std::enable_if< my_condition<T, X>::value >::type> {
bool operator()() { return true; }
};
template <class T>
void DoTest() {
enable_if_tester<T> test;
assert( test() );
}
};
int main() {
SomeClass<float>().DoTest<int>();
return 0;
}
.
누군가 가이 설명에 대해 설명하기를 바랍니다.
해결책
모든 것이 당신의 코드로 괜찮습니다. VC는 버그가 있습니다.템플릿 멤버 클래스의 부분 템플릿 전문화에 문제가있는 것으로 알려져 있습니다.
제휴하지 않습니다 StackOverflow