Подтвердить что ты не робот

Ошибка компиляции с указателем на функцию шаблона в Visual Studio 2008

Я пытаюсь создать класс шаблона, который хранит указатель на функцию шаблона, но столкнулся с ошибкой компиляции в Visual Studio 2008. Я создал для него упрощенный тестовый пример (см. ниже), который все еще не скомпилирован в VS2008, но, похоже, успешно скомпилировался в онлайн-компиляторах Comeau и онлайн GCC, которые я пробовал.

Ошибка, которую я вижу, это:

error C2436: 'func' : member function or nested class in constructor initializer list
temp.cpp(21) : while compiling class template member function 'test_class<T>::test_class(T (__cdecl &))'
1>        with
1>        [
1>            T=int (const int &)
1>        ]

Работает тот же тест с использованием функции без шаблона. Коротко это, кто-нибудь знает обходной путь для проблемы, или VS2008 ожидает какой-то другой синтаксис для этого?

Спасибо,

Джерри

template<class T>
T template_function(const T& arg)
{
    return arg;
}

int non_template_function(const int& arg)
{
    return arg;
}

template<class T>
class test_class
{
public:
    test_class(const T& arg) : func(arg) {}
private:
    T func;
};

template<class T>
void create_class(const T& arg)
{
new test_class<T>(arg);
}

int main()
{
    create_class(&template_function<int>); //compile fails unless this is commented out
    create_class(&non_template_function);
    return 0;
}
4b9b3361

Ответ 1

Мне кажется, что "const T & arg" в test_class и create_class - ваша проблема. Изменение этих параметров на простой "T arg", похоже, сглаживает ситуацию.

Ответ 2

Исправить в двух местах;

T* func; //make this pointer type!

и,

 create_class(template_function<int>); //remove '&'
 create_class(non_template_function); //remove '&'

Готово!

Ответ 3

Похоже на ошибку компилятора, потому что на самом деле он думает, что вы пытаетесь вызвать эту функцию вместо инициализации.

У меня нет компилятора VS С++, но объявление T в качестве указателя может решить проблему:

template<class T>
class test_class
{
public:
    test_class(const T& arg) :
        func(&arg)
    {
    }

private:
    T *func;
};


template<class T>
void create_class(const T& arg)
{
    new test_class<T>(arg);
}

int main()
{
    create_class(template_function<int>); //compile fails unless this is commented out
    create_class(non_template_function);
}