Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;使用的模板名称不带模板参数_C++ - Fatal编程技术网

C++ C++;使用的模板名称不带模板参数

C++ C++;使用的模板名称不带模板参数,c++,C++,我一直在使用“constobjarray&”作为ObjArray模板的参数,但没有考虑它。它似乎很好用,但当我再读一遍时,它就消失了。它不应该是“constobjarray&”吗?引用没有参数的模板名称可以吗?仅仅因为编译器假定它是内联的,所以它在下面工作吗 template <class T> class ObjArray : public BArray { public: inline ObjArray() : BArray(sizeof(T), NULL

我一直在使用“
constobjarray&
”作为ObjArray模板的参数,但没有考虑它。它似乎很好用,但当我再读一遍时,它就消失了。它不应该是“
constobjarray&
”吗?引用没有参数的模板名称可以吗?仅仅因为编译器假定它是内联的,所以它在下面工作吗

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);
    }
    ...
};
模板
类:公共营房
{
公众:
内联ObjArray():
BArray(sizeof(T),空)
{
}
内联ObjArray(常量ObjArray和src):
BArray(sizeof(T),空)
{
复制自((ObjArray&)src);
}
内联ObjArray(ObjArray和src):
BArray(sizeof(T),空)
{
copyrom(src);
}
...
};

否,这种用法是正确的:在类模板中,类名引用模板的实例,因此模板参数不是必需的:

template<typename T>
struct foo
{
    foo( const foo& ); //Copy ctor. foo is the same as foo<T>
};
模板
结构foo
{
foo(const foo&);//Copy ctor.foo与foo相同
};
该行为在本标准的第14.6.1节“当地公布的名称”中有明确的定义(强调):

14.6.1本地声明的名称[临时本地]
与普通(非模板)类一样,类模板具有注入的类名 (第9条)注入的类名可以使用带或不带 模板参数列表。如果使用时没有 模板参数列表,它等效于注入的类名 后面是中包含的类模板的模板参数 。当它与模板参数列表一起使用时,它引用 指定的类模板专门化,可以是当前 专业化或其他专业化

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

template<typename U>
operator foo<U>() const //Implicit conversion to other instance of the template
{
    return ...;
}
模板
运算符foo()const//隐式转换为模板的其他实例
{
返回。。。;
}

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

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

这仍然是正确的。请注意,只有第一个foo显式地携带模板参数。一旦指定了它,上下文就被完全定义了,现在您可以使用foo作为一个完全合法的类名,因此
foo
参数将自动引用
foo

在类定义中是可以的。类名在其自身定义中是可见的。这称为“类名注入”。对于类模板,如果模板名称后面没有模板参数,则将其视为注入的类名。是的,在
ObjArray
的定义中只使用
ObjArray
是可以的。