在Comeau编译器上检测类是否有重载函数失败

时间:2010-05-04 19:50:54

标签: c++ templates overloading sfinae comeau

我正在尝试使用SFINAE来检测某个类是否具有需要特定类型的重载成员函数。我的代码似乎在Visual Studio和GCC中正常工作,但不使用Comeau在线编译器进行编译。

以下是我正在使用的代码:

#include <stdio.h>

//Comeau doesnt' have boost, so define our own enable_if_c
template<bool value> struct enable_if_c { typedef void type; };
template<> struct enable_if_c< false > {}; 


//Class that has the overloaded member function
class TestClass
{
public:
    void Func(float value) { printf( "%f\n", value ); }
    void Func(int value) { printf( "%i\n", value ); }
};


//Struct to detect if TestClass has an overloaded member function for type T
template<typename T>
struct HasFunc
{
    template<typename U, void (TestClass::*)( U )> struct SFINAE {};
    template<typename U> static char Test(SFINAE<U, &TestClass::Func>*);
    template<typename U> static int Test(...);
    static const bool Has = sizeof(Test<T>(0)) == sizeof(char);
};


//Use enable_if_c to only allow the function call if TestClass has a valid overload for T
template<typename T> typename enable_if_c<HasFunc<T>::Has>::type CallFunc(TestClass &test, T value) { test.Func( value ); } 

int main()
{
    float value1 = 0.0f;
    int value2 = 0;
    TestClass testClass;
    CallFunc( testClass, value1 );  //Should call TestClass::Func( float )
    CallFunc( testClass, value2 );  //Should call TestClass::Func( int )
}

错误消息是:没有函数模板的实例“CallFunc”匹配参数列表。似乎HasFunc :: Has对于int和float是假的,应该是真的。

这是Comeau编译器中的错误吗?我做的事情不标准吗?如果是这样,我需要做些什么来解决它?

更新

我想问题现在变成,如果这是一个错误,我可以做些什么来解决它?我尝试在&amp; TestClass :: Func上使用static_cast,但要么是不可能的,要么我没有得到正确的语法,因为我无法编译它。

如果这不是解决方案,我是否可以对TestClass或HasFunc进行任何修改以解决此问题?

1 个答案:

答案 0 :(得分:0)

我怀疑问题是,当TestClass重载Func并且Comeau编译器无法消除&amp; TestClass :: Func的歧义,即使它应该。