Член шаблона std :: function без шаблонного класса - PullRequest
0 голосов
/ 26 января 2020

У меня есть класс, который имеет шаблонную функцию

class DialogManager
{
public:
    template<class T>
    using TimeoutCallback = std::function<void (T)>;

    DialogManager();
    virtual ~DialogManager();

    template<class T>
    void SetTimeoutCallback(TimeoutCallback<T> callback);

    int GetDialoge(T obj);

private:
    TimeoutCallback mTimeoutCallback;
}

Я получаю ошибку ниже:

ошибка: недопустимое использование имени шаблона 'DialogManager :: TimeoutCallback' без списка аргументов

Я изменил код на

template<class T>
TimeoutCallback<T> mTimeoutCallback;

, но у меня есть ошибка другого компилятора

error: data member 'mTimeoutCallback 'не может быть шаблоном участника

пример использования

#include <DialogManager.h>

class foo()
{
public:
    foo()
    {
        DialogManager* dialog = new DialogManager();
    }

    DialogManager* mDialogManager;
};

struct data
{
    data() {}
};

int main()
{
    Foo* f1 = new Foo();
    auto a1 = f1->mDialogManager->GetDialoge(1);
    auto b1 = f1->mDialogManager->GetDialoge("test");

    Foo* f2 = new Foo();

    data d;
    auto a2 = f2->mDialogManager->GetDialoge(d);
    auto b2 = f2->mDialogManager->GetDialoge(45.231);

    return 0;
}

`

Ответы [ 3 ]

1 голос
/ 26 января 2020

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

#include <functional>

template<class T>
class DialogManager
{
public:
    using TimeoutCallback = std::function<void (T)>;

    DialogManager();
    virtual ~DialogManager();

    void SetTimeoutCallback(TimeoutCallback callback);

private:
    TimeoutCallback mTimeoutCallback;
};
0 голосов
/ 26 января 2020

Ваш mTimeoutCallback является переменной-членом шаблона; разрешая using, это

template<class T>
std::function<void (T)> mTimeoutCallback;

К сожалению (а) переменные шаблона доступны только начиная с C ++ 14 (и вы пометили C ++ 11) и (b) переменная шаблона может быть член класса / структуры, только если static.

Итак, ваши ошибки.

0 голосов
/ 26 января 2020

Если вы пишете файл заголовка класса, то обычно вы хотите создать шаблон класса и использовать имя типа шаблона в качестве типа переменной в этом файле. Затем внутри файла кодера вы можете определить методы, аналогичные тем, которые вы использовали в предоставленном вами коде. Похоже, вы исправили первую ошибку компиляции, а вторая ошибка, по-видимому, из-за того, что вы используете шаблоны в заголовочном файле. Вот базовый c пример шаблона файла заголовка:

`template<typename T>
class Node{
    private:
        T m_entry;
        Node<T>* m_nextNodePtr;
    public:
        T getEntry() const;
        void setEntry(T newEntry);
        //more
}`

А вот сопроводительный файл заголовка файла заголовка:

`template<typename T>
T Node<T>::getEntry() const{
    return m_entry;
}

template<typename T>
void Node<T>::setEntry(T newEntry){
    m_entry = newEntry;
    return;

//more
}`

Надеюсь, это поможет!

...