模板成员std ::无模板类的功能

问题描述 投票:0回答:3

我有一个具有模板化功能的类

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

    DialogManager();
    virtual ~DialogManager();

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

private:
    TimeoutCallback mTimeoutCallback;
}

我得到以下错误:

错误:无效使用模板名称“ DialogManager :: TimeoutCallback”没有参数列表

我已将代码更改为

template<class T>
TimeoutCallback<T> mTimeoutCallback;

但是我遇到了另一个编译器的错误

错误:数据成员'mTimeoutCallback'不能是成员模板

c++ c++11 templates std-function
3个回答
0
投票

如果要在类的不同部分共享相同的模板类型,请使其成为模板类而不是模板函数。

#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
投票

如果要编写类头文件,则通常需要对类进行模板化,并将模板类型的名称用作该文件中的变量类型。然后,在编码器文件中,您可以定义与提供的代码相似的方法。看来您已解决了第一个编译错误,而第二个错误似乎是因为您要在头文件中模板化各个方法。这是模板化头文件的基本示例:

`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
}`

希望这会有所帮助!


0
投票

您的mTimeoutCallback是模板成员变量;解决using,它是一个

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

不幸的是,(a)模板变量仅可从C ++ 14开始使用(并且您已标记C ++ 11),并且(b)仅当static时,模板变量才能成为类/结构的成员。

是您的错误。

© www.soinside.com 2019 - 2024. All rights reserved.