没有模板参数的C ++模板名称

时间:2014-04-13 16:57:16

标签: c++

我一直在使用“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);
    }
    ...
};

2 个答案:

答案 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>