2

我正在尝试遵循 C++ Template The Complete Guide 书中的代码,但它无法使用 Visual Studio 2010 进行编译。

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>();
}

以下是编译器错误。

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 ==========
4

1 回答 1

1

是这一行吗:

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

无法从中推断出类型名。我认为它应该是:

static Two test(...);
于 2012-11-07T16:48:11.777 回答