我一直在使用“const ObjArray&
”作为ObjArray模板的参数而不考虑它。它似乎工作正常,但当我再次阅读它时,它看起来很好。不应该是“const ObjArray<T> &
”吗?没有参数可以引用模板名称吗?它是否在下面工作只是因为它被内联声明编译器假设为T?
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);
}
...
};
答案 0 :(得分:4)
不,这种用法是正确的:在类模板中,类名是指模板的那个实例,因此模板参数不是必需的:
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-argument-list,相当于inject-class-name 后跟括在其中的类模板的模板参数 &LT;&GT; 即可。当它与template-argument-list一起使用时,它指的是 指定的类模板特化,可以是当前的 专业化或其他专业化。
请注意,语法只是当前模板实例的别名。如果您需要与其他参数使用相同的模板,则需要使用经典语法明确指定它。例如:
template<typename U>
operator foo<U>() const //Implicit conversion to other instance of the template
{
return ...;
}
答案 1 :(得分:1)
是的,这是正确的c ++语法。关于它是关于内联的问题,你可以在类声明之外这样写它:
template<typename T>
foo<T>::foo(const foo&)
{}
它仍然是正确的。请注意,只有第一个foo明确地带有模板参数。一旦指定,就完全定义了上下文,现在您可以将foo用作完全合法的类名,因此foo
参数将自动引用foo<T>
。