[英]Templated typedef workaround doesn't seem to work
我正在使用C ++ 03(真的是CUDA nvcc,但這沒關系)。 我有以下一些工作代碼:
template<typename T> void baz(T*);
template<typename T>
void bar() {
typedef void (*foo_t)(T*);
static const foo_t dummy = baz;
// use dummy
};
現在,我想將虛擬變量移出函數,使其成為全局變量。
第一次嘗試:
template<typename T> void baz(T*);
template<typename T> typedef void (*foo_t)(T*);
template<typename T> const foo_t dummy = baz;
template<typename T>
void bar() {
// use dummy
};
這不起作用,因為C ++(至少,C ++ 03)沒有模板化的typedef:
error: "typedef" may not be specified here
error: "foo_t" is not a function or static data member
為什么C ++ 03沒有這個? 甘拜下風。 如果我可以在一個函數中執行它,我不明白為什么我也不能在外面執行它。 我認為C ++ 11也沒有(但有模板using
,對吧?)
好的,所以我讀了模板typedef - 你的工作是什么? ,並找到了接受的答案 - 使用助手類。
第二次嘗試:
template<typename T> void baz(T*);
template<typename T> class TemplatingHeler {
typedef void (*foo_t)(T*);
static const foo_t dummy = baz;
}
......得到:
error: a member of type "void (*const)(T *)" cannot have an in-class initializer
第三次嘗試:
template<typename T> void baz(T*);
template<typename T> class TemplatingHelper {
typedef void (*foo_t)(T*);
static foo_t dummy;
};
template<typename T> TemplatingHelper::dummy = baz;
error: name followed by "::" must be a class or namespace name
error: argument list for class template "TemplatingHelper" is missing
...和nvcc段錯誤(!)
為什么會發生這種情況,我怎樣才能讓它發揮作用?
修復錯誤后,您的第三次嘗試應該有效;)
template<typename T> void baz(T*);
template<typename T> class TemplatingHelper {
typedef void (*foo_t)(T*);
static foo_t dummy;
};
template<typename T> // template-declaration
typename TemplatingHelper<T>::foo_t // type
TemplatingHelper<T>::dummy // name
= baz; // initializer
我同意這是多余的,但它遵循一般的聲明形式:
type name initializer ;
即使名稱已經聲明並在類模板中給出了一個類型。
在這種情況下,它是一個模板聲明,所以我們需要添加template<typename T>
部分; 這是必需的,因為我們也可以參考部分專業化:
template<typename T, typename U> class TemplatingHelper<T(*)(U)>
{
typedef T(*foo_t)(U);
static foo_t dummy;
};
template<typename T, typename U>
typename TemplatingHelper<T(*)(U)>::foo_t
TemplatingHelper<T(*)(U)>::dummy
= baz;
由於類型是必需的並且在聲明的名稱之前,我們需要明確說明范圍在哪里找到它:
TemplatingHelper<T>::foo_t
不幸的是,名稱查找需要在此限定名稱前加上一個typename
名稱。 看看我在哪里以及為什么要放置“template”和“typename”關鍵字?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.