C++ 模板错误:非类型";。。[with T=T]不是类型名称;

C++ 模板错误:非类型";。。[with T=T]不是类型名称;,c++,templates,compiler-errors,cross-compiling,C++,Templates,Compiler Errors,Cross Compiling,在尝试键入定义内存对齐方式时,我提出了以下构造(由于需要更正GNU版本,因此仍有一些工作在进行中): #如果已定义(uu GNUG_uu) 模板 结构sfo_类型{ typedef T*restrict uuu属性uuu((对齐(32)))aptr32; }; #已定义的elif(_英特尔编译器) 模板 结构sfo_类型{ typedef T*restrict uuu属性uuu((对齐(32)))aptr32; }; #恩迪夫 然后我试着这样使用它: template<typename

在尝试键入定义内存对齐方式时,我提出了以下构造(由于需要更正GNU版本,因此仍有一些工作在进行中):

#如果已定义(uu GNUG_uu)
模板
结构sfo_类型{
typedef T*restrict uuu属性uuu((对齐(32)))aptr32;
};
#已定义的elif(_英特尔编译器)
模板
结构sfo_类型{
typedef T*restrict uuu属性uuu((对齐(32)))aptr32;
};
#恩迪夫
然后我试着这样使用它:

template<typename T>
class tsfo_vector {
private:
   sfo_type<T>::aptr32  m_data;
   int                  m_size;
...
模板
类tsfo_向量{
私人:
sfo_类型::aptr32 m_数据;
国际货币单位大小;
...
但随后我收到以下错误消息:

/Users/bravegag/code/fastcode_project/code/src/sfo_vector.h(43): error: nontype "sfo_type<T>::aptr32 [with T=T]" is not a type name
 sfo_type<T>::aptr32 m_data;
 ^
/Users/bravegag/code/fastcode\u project/code/src/sfo\u vector.h(43):错误:非类型“sfo\u type::aptr32[with T=T]”不是类型名称
sfo_类型::aptr32 m_数据;
^

有人能告诉我这里出了什么问题吗?

aptr32
依赖于
T
,因此:

template<typename T>
    class tsfo_vector {
    private:
        typename sfo_type<T>::aptr32 m_data;
      //^^^^^^^^
模板
类tsfo_向量{
私人:
类型名称sfo_类型::aptr32 m_数据;
//^^^^^^^^

关于
typename
用法的进一步解释,请参见

Nice,谢谢!事实上,我对此感到困惑…为什么数据成员必须在前面有一个typedef标记才能编译?这有点奇怪。@GiovanniAzua,链接的答案解释了
typename
的用法,比我能解释的好得多。@GiovanniAzua:不是e数据成员,但其类型的前缀是
typedef
。简单的回答是,即使编译器可能有您对
sfo_类型的定义,也可能在您使用它的地方有一个明确的专门化(如sfo_类型);不要求专门化具有与常规模板相同的成员,因此您必须告诉编译器“此名称必须是类型的名称”。这就是
typename
所做的。
template<typename T>
    class tsfo_vector {
    private:
        typename sfo_type<T>::aptr32 m_data;
      //^^^^^^^^