我有这段代码:
template <typename A>
class templatedclass {
public:
using type = templatedclass;
};
template <typename A>
class sinkstuff {
public:
void print() {
cout << "generic sinkstuff";
}
};
template <typename A>
class sinkstuff <templatedclass<A>> {
public:
void print() {
cout << "partiallyspecialized sinkstuff";
}
};
template <typename NtoA>
struct pass_parameter : sinkstuff<typename templatedclass<NtoA>::type> {};
int main() {
pass_parameter<int> obj;
obj.print();
cout << is_same<templatedclass<int>, typename templatedclass<int>::type>::value; // 1, yes
}
我一直认为&#34;使用指令&#34;是类固醇的类型。为什么我可以使用&#34; templatedclass<int>::type
&#34;没有再次指定参数,即&#34; templatedclass<int>::type<int>
&#34; ?
Isn&#39;#34;使用type = templatedclass&#34;只是一个文字替代?我错过了什么吗?
答案 0 :(得分:4)
一个班级的名字是&#34;注入&#34;在这个类中,这被称为 inject-class-name 。它类似于:
class my_class_name
{
public:
typedef ::my_class_name my_class_name;
};
(但这当然没有编译,一个类可能没有与该类同名的手动声明的成员。)
类模板也有一个注入类名,它可用于引用类模板本身或当前特化(包括当前模板参数),具体取决于上下文:
[temp.local] / 1
与普通(非模板)类一样,类模板具有注入类名称。 inject-class-name可以用作模板名称或类型名称。当它与 template-argument-list 一起使用时,作为模板 template-parameter 的 template-argument ,或作为最终标识符在友元类模板声明的 elaborated-type-specifier 中,它引用了类模板本身。 否则,它是等效的 到 template-name ,后跟
<>
中包含的类模板的 template-parameters 。
答案 1 :(得分:2)
这与using
指令没有任何关系。在A<T>
的定义中(using
指令在该范围内),说A
与说A<T>
相同。
这与你写的原因相同:
template <typename T>
struct A
{
void foo(const A&);
};
而不是
template <typename T>
struct A
{
void foo(const A<T>&);
};
有关详情,请搜索&#34; 注入课程名称&#34;。