2012-11-06 4 views
2

내가 책 C++ 템플릿의 코드에 완전한 가이드 다음하려하지만 다음 Visual Studio 2010에서 Visual Studio 2010을Determininig 클래스 유형

template < typename T> 
class IsClassType { 
private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(int C::*); 
    template<typename C> static Two test(...); 

public: 
    enum { Yes = sizeof (IsClassType<T>::test<T>(0)) == 1 }; 
    enum { No = !Yes }; 
}; 

template < typename T> 
void check() { 
    if (IsClassType<T>::Yes) { 
    std::cout << " IsClassType Yes " << std::endl; 
    } else { 
    std::cout << " IsClassType No " << std::endl; 
    } 
} 

int main() { 
    std::cout << "Int:  "; 
    check<int>(); 
} 

로 컴파일 실패하면 컴파일러 오류입니다.

template<typename C> static Two test(...); 

유형 이름이 추론 할 수 없습니다

1>------ Build started: Project: test123, Configuration: Debug Win32 ------ 
1> test123.cpp 
1>e:\svn\office_expt\test123\test123\test123.cpp(45): error C2783: 'IsClassType<T>::Two IsClassType<T>::test(...)' : could not deduce template argument for 'C' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   e:\svn\office_expt\test123\test123\test123.cpp(42) : see declaration of 'IsClassType<T>::test' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   e:\svn\office_expt\test123\test123\test123.cpp(51) : see reference to class template instantiation 'IsClassType<T>' being compiled 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   e:\svn\office_expt\test123\test123\test123.cpp(60) : see reference to function template instantiation 'void check<int>(void)' being compiled 
1>e:\svn\office_expt\test123\test123\test123.cpp(45): error C2784: 'IsClassType<T>::One IsClassType<T>::test(int C::*)' : could not deduce template argument for 'int C::* ' from 'int' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   e:\svn\office_expt\test123\test123\test123.cpp(41) : see declaration of 'IsClassType<T>::test' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>e:\svn\office_expt\test123\test123\test123.cpp(45): error C2056: illegal expression 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+1

작품 : C++ 11에서 http://liveworkspace.org/code/8cb9f517c8bb7576d434a62ef7f41402 – Pubby

+1

, 당신은 ['표준 : is_class'] (HTTP를 사용할 수 있습니다 : // en.cppreference.com/w/cpp/types/is_class) 메타 기능. – Nawaz

답변

1

는이 라인입니다. 나는 그것을 읽어해야한다고 생각 : GCC에

static Two test(...);