Обнаружение, если класс перегружена функцией не удается на компиляторе Comeau

StackOverflow https://stackoverflow.com/questions/2768508

Вопрос

Я пытаюсь использовать Sfinae для обнаружения, если класс имеет перегруженную функцию пользователей, которая принимает определенный тип. Код, который у меня есть, кажется, работает правильно в Visual Studio и GCC, но не скомпилируется с использованием компилятора Comeau Online.

Вот код, который я использую:

#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 :: есть ложь для int и float, когда оно должно быть правдой.

Это ошибка в компиляторе Comeau? Я делаю то, что не стандартно? И если так, что мне нужно сделать, чтобы исправить это?

Обновлять

Я думаю, что вопрос сейчас становится, если это ошибка, есть ли что-нибудь, что я могу сделать, чтобы обойти его? Я пытался использовать Static_Cast On & TestClass :: Func, но либо это невозможно, либо не получили синтаксис права, потому что я не мог получить его для компиляции.

Если это не решение, есть ли какие-либо модификации, которые я могу сделать либо для TestClass или hasfunc, чтобы работать по всему вопросу?

Это было полезно?

Решение

Я подозреваю, что проблема в том, что поскольку TestClass Levelloads Func и Comeau Compiler не может неоднозначно и TestClass :: Func, даже это должно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top