我有一个具有模板化功能的类
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'不能是成员模板
如果要在类的不同部分共享相同的模板类型,请使其成为模板类而不是模板函数。
#include <functional>
template<class T>
class DialogManager
{
public:
using TimeoutCallback = std::function<void (T)>;
DialogManager();
virtual ~DialogManager();
void SetTimeoutCallback(TimeoutCallback callback);
private:
TimeoutCallback mTimeoutCallback;
};
如果要编写类头文件,则通常需要对类进行模板化,并将模板类型的名称用作该文件中的变量类型。然后,在编码器文件中,您可以定义与提供的代码相似的方法。看来您已解决了第一个编译错误,而第二个错误似乎是因为您要在头文件中模板化各个方法。这是模板化头文件的基本示例:
`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
}`
希望这会有所帮助!
您的mTimeoutCallback
是模板成员变量;解决using
,它是一个
template<class T>
std::function<void (T)> mTimeoutCallback;
不幸的是,(a)模板变量仅可从C ++ 14开始使用(并且您已标记C ++ 11),并且(b)仅当static
时,模板变量才能成为类/结构的成员。
是您的错误。