【发布时间】:2013-11-14 14:29:35
【问题描述】:
我正在使用 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,对吧?)
好的,所以我阅读了Template typedefs - What's your work around?,并选择了接受的答案 - 使用帮助类。
第二次尝试:
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 段错误 (!)
为什么会发生这一切,我怎样才能让它发挥作用?
【问题讨论】:
-
您正在使用没有模板参数的模板。无论如何,第一个是变量模板,它指日可待。
-
模板化类型定义有一个替代方案:模板化
using。你应该使用using(不要与“你需要移动它移动它”混淆)。 -
@stefan:模板化
using不是 C++11 的一个特性吗?无论如何,你能在某处举个例子或链接吗? -
C++0x 是 C++11 的旧名称。较旧的标准称为 C++03。
-
哦,也许我可以帮忙!您遇到了什么具体错误?
标签: c++ templates typedef c++03