在回答一个问题时,我遇到了这样的代码:
template<class T, class... Ts> void foo();
template <class T, class T::value_type>
void foo() { }
它以代码专用foo
模板函数的形式呈现,这是不对的,但这不是我的问题。我想知道为什么编译器class T::value_type
在模板参数中允许这样的构造:我的意思是,这很明显是错误的,我无法提出范围运算符可能是参数名称(模板或函数)一部分的任何情况。因此,我有两个问题:
如评论中所述,它是一个精心设计的类型说明符。最好用一个例子解释一下:
int main() {
struct foo {}; // ok
int foo = 0; // ok
int test = foo; // ok, refers to variable 'foo'
foo a; // error, 'foo' refers to variable
struct foo b; // ok, 'struct' means that name lookup searches for classes only
}
从本质上讲,你可以把它们(的struct/class
,enum
)作为一个更受限制typename
,因为它们只允许类或枚举分别。另请注意,typename
原始示例中允许这样做!
template<class T, class... Ts> void foo();
template <class T, typename T::value_type> // Ok, value_type needs to be a type
// ^^^^^^^^^^^^^^^^^^^^^^^ it's a non-type template parameter
void foo() { }
如果您有一个类型和一个具有相同名称的变量,或者要指定一个具有从属名称的东西(例如,在中class T::value_type
,value_type
是一个类,没有class
之前的名称,那么它将是一个值),则需要使用它。使用a typename
。)
我无法想出范围运算符可能是参数名称一部分的任何情况
您唯一想到的是类型模板参数。非类型模板参数可以很好地使用范围运算符来命名类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句