C++ 模板化的typedef解决方案不';好像不行

C++ 模板化的typedef解决方案不';好像不行,c++,templates,typedef,c++03,C++,Templates,Typedef,C++03,我使用的是C++03(CUDA nvcc,但这并不重要)。我有以下工作代码: 。。。这将得到: 错误:类型为“void(*const)(T*)”的成员不能有类内初始值设定项 第三次尝试: template<typename T> void baz(T*); template<typename T> typedef void (*foo_t)(T*); template<typename T> const foo_t dummy = baz; template

我使用的是C++03(CUDA nvcc,但这并不重要)。我有以下工作代码:

。。。这将得到:

错误:类型为“void(*const)(T*)”的成员不能有类内初始值设定项

第三次尝试:

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
};
template<typename T> void baz(T*);
template<typename T> class TemplatingHeler {
  typedef void (*foo_t)(T*);
  static const foo_t dummy = baz;
}
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;
模板无效baz(T*);
模板类TemplatingHelper{
类型定义无效(*foo_t)(t*);
静态foo_t假人;
};
模板TemplatingHelper::dummy=baz;
错误:名称后接“:::”必须是类或命名空间名称

错误:缺少类模板“TemplatingHelper”的参数列表

。。。和nvcc故障(!)


为什么会发生这种情况,我如何才能让它工作?

在修复错误后,您的第三次尝试应该会工作;)

即使名称已经在类模板中声明并给定了类型

在本例中,它是一个模板声明,因此我们需要添加
模板
部分;这是必需的,因为我们也可以引用部分专业化:

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)(U);
静态foo_t假人;
};
模板
typename TemplatingHelper::foo\u t
TemplatingHelper::dummy
=baz;
由于类型是必需的,并且位于声明的名称之前,因此我们需要显式说明查找该类型的范围:

TemplatingHelper<T>::foo_t
TemplatingHelper::foo\u t

不幸的是,名称查找需要在此限定名称之前放置一个
typename
。请参见

您使用的模板没有模板参数。无论如何,第一个是变量模板,它就在拐角处。模板化typedefs还有一个替代方法:使用模板化
。你应该使用<代码>使用<代码>(不要与“你需要移动它-移动它”混淆)。@stefan:使用<代码>模板不是C++11的一项功能吗?无论如何,你能给出一个例子或链接吗?C++0x是C++11的旧名称。旧的标准叫做C++03.Ooh,也许我能帮上忙!你得到了什么具体的错误?那肯定是我见过的最有缺陷的C++代码。为什么我需要用@#k$k指定已经声明的内容的类型?为什么我需要在typename之前加上
typename
关键字?@einpoklum我已经试着解释过了。。部分。。在最新的答复中;在C++11中有更简单的方法(除了别名template=template typedef之外),例如
template decltype(TemplatingHelper::dummy)TemplatingHelper::dummy=baz(宏更简单),但我用这个遇到了编译器错误。。事情另外,
constexpr
允许在类定义中初始化
dummy
。我不明白为什么初始化语句需要采用声明的格式<代码>虚拟
已声明。假设
TemplatingHelper
不是一个模板类,而
dummy
只是一个int。我不能用语句
TemplatingHelper::dummy=7
初始化它吗?@einpoklum”我不能用语句“否”初始化它。原因是它不仅仅是一个初始化,而是一个定义。也就是说,该语句还定义了变量在链接之前放置在哪个对象文件中。(从任何其他翻译单元,它被称为
extern
变量。)作为一个定义,它本身也是一个声明(一个重新声明)。当然,这就是它的定义。解析可能更简单,因为它不是一个特例,只是另一个定义。正如我所说,编译器可以推断数据类型(->
decltype
)。
type name initializer ;
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