2014-04-13 78 views
5

我一直在使用“const ObjArray&”作为ObjArray模板的参数而没有考虑它。它看起来工作正常,但是当我再次阅读它时,它看起来很不错。它不应该是“const ObjArray<T> &”吗?引用没有参数的模板名称可以吗?它是否仅仅是因为它被内联编译器假定为T而工作?使用不带模板参数的C++模板名称

template <class T> 
class ObjArray : public BArray 
{ 
public: 
    inline ObjArray() : 
     BArray(sizeof(T), NULL) 
    { 
    } 

    inline ObjArray(const ObjArray& src) : 
     BArray(sizeof(T), NULL) 
    { 
     copyFrom((ObjArray&)src); 
    } 

    inline ObjArray(ObjArray& src) : 
     BArray(sizeof(T), NULL) 
    { 
     copyFrom(src); 
    } 
    ... 
}; 
+9

在类定义里面可以。 – juanchopanza

+1

类名在其自己的定义中可见。这被称为“类名注入”。对于类模板,如果没有模板参数,则模板名称将被视为注入的类名称。所以是的,在'ObjArray'的定义中使用'ObjArray'就没关系。 –

回答

4

不,用法是正确的:在内部类模板,类名是指模板的该实例,所以模板参数是不是neccesary:

template<typename T> 
struct foo 
{ 
    foo(const foo&); //Copy ctor. foo is the same as foo<T> 
}; 

这种行为被明确定义在点14.6.1局部声明的名称的标准(重点煤矿)的:

14.6.1本地声明的名称[temp.local]
与正常(非模板)类相似,类模板具有注入类名称 (第9章)。 注入类名可以使用或不使用 模板参数列表。在没有 模板参数列表的情况下使用它时,它相当于注入类名称 ,后跟包含在 <>中的类模板的模板参数。当它与模板参数列表一起使用时,它指的是 指定的类模板特化,可能是当前的 特化或其他特化。

请注意,语法只是当前模板实例的别名。如果您需要与其他参数相同的模板,则需要使用经典语法来显式指定它。例如:

template<typename U> 
operator foo<U>() const //Implicit conversion to other instance of the template 
{ 
    return ...; 
} 
1

是的,它是正确的C++语法。关于你的内联问题,你可以在类声明之外这样写:

template<typename T> 
foo<T>::foo(const foo&) 
{} 

而且它仍然是正确的。注意只有第一个foo明确地携带了模板参数。指定完成后,上下文将被完全定义,现在您可以使用foo作为完全合法的类名称,因此foo参数将自动引用foo<T>