错误C2784:无法推断模板参数

时间:2010-03-16 13:50:11

标签: c++ templates

还在与模板战斗。在这个例子中,尽管直接从书中复制的事实我收到以下错误消息:Error 2 error C2784: 'IsClassT<T>::One IsClassT<T>::test(int C::* )' : could not deduce template argument for 'int C::* ' from 'int'.

这是一本书Templates - The Complete Guide的例子。 (我使用Visual Studio 2010 RC)。

  template<typename T> 
    class IsClassT { 
      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(IsClassT<T>::test<T>(0)) == 1 }; 
        enum { No = !Yes }; 
    }; 

class MyClass { 
}; 

struct MyStruct { 
}; 

union MyUnion { 
}; 

void myfunc() 
{ 
} 

enum E {e1} e; 

// check by passing type as template argument 
template <typename T> 
void check() 
{ 
    if (IsClassT<T>::Yes) { 
        std::cout << " IsClassT " << std::endl; 
    } 
    else { 
        std::cout << " !IsClassT " << std::endl; 
    } 
} 

// check by passing type as function call argument 
template <typename T> 
void checkT (T) 
{ 
    check<T>(); 
} 

int main() 
{ 
    /*std::cout << "int: "; 
    check<int>(); */

    std::cout << "MyClass: "; 
    check<MyClass>(); 
}

虽然我大致知道这个例子中发生了什么,但我无法解决这个错误 谢谢你的帮助。

3 个答案:

答案 0 :(得分:5)

如果您没有完全限定test表达式,我的编译器(MSVC2008TS)会喜欢它:

enum { Yes = sizeof(test<T>(0)) == 1 }; 

但这甚至是合法代码吗?

答案 1 :(得分:3)

不应该这一行

    enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 }; 

    enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == 1 }; 

代替?`

(因为我是肛门,我会写sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One)。)

答案 2 :(得分:1)

不完全是这个问题的答案,而是针对您的问题的不同方法。我发现在专业化中而不是在该模板中定义的函数中更容易进行SFINAE测试:

// used to pass a type tested with SFINAE
template<typename T> struct tovoid { typedef void type; };

使用它来传递可能无效的类型:

template<typename T, typename U = void> 
struct is_class {
  static bool const value = false;
};

// if "int T::*" is a valid type, this specialization is used
template<typename T>
struct is_class<T, typename tovoid<int T::*>::type> {
  static bool const value = true;
};

这种方式相当短,而sizeof的噪音却没有完成。