最近,我在读这本书:C++ templates: the complete guide
David Vandevoorde 和 Nicolai M. Josuttis 写的。
特别是关于模板解析引用的书 pp 126。
类模板也有注入类名,但是,它们比普通注入类名更奇怪:它们后面可以跟模板参数(在这种情况下它们是注入类模板名称),但是如果它们后面没有模板参数,它们代表以参数为参数的类(或者,对于部分特化,它的特化参数)。
书中相关代码除外,如下:
template<template<typename> class TT>
class X
{
};
template <typename T>
class C
{
C* a; //OK, same as "C<T>* a"
C<void> b; // OK
X<C> c; //Error, C without a template argument list does not denote a template
X< ::C>d;
};
int main()
{
return 0;
}
上面的代码示例试图解释整个引用的段落。
我在 gcc 4.5.3 中编译了上面的代码,它输出:
error: field ‘b’ has incomplete type
因此,我有以下问题:
- 为什么编译器会生成完全不同的错误消息?书
b
上说没问题,但 gcc 给出了错误;同时,没有检测到书中列出的其他错误?为什么,这可能是书中的编译器错误或错误? - 是什么
injected class names
意思?我如何识别哪些名称是injected class names
哪些不是? - 为什么
C*a
一样C<T>* a
?我尝试用 替换C*a
,C<T>* a
没有报错,那么是?C* a
的简写C<T>* a
?
非常感谢!