[英]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.