[英]Template member std::function of none templated class
我有一個類,它具有模板化功能
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;
但我得到了另一個編譯器的錯誤
錯誤:數據成員“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;
}
`
如果要在類的不同部分共享相同的模板類型,請使其成為模板類而不是模板函數。
#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
時才可以是類/結構的成員。
所以你的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.