在模板,在那里,为什么我必须把typename
和template
上依赖的名字呢?究竟什么是依赖名称?我有以下代码:
template <typename T, typename Tail> // Tail will be a UnionNode too.
struct UnionNode : public Tail {
// ...
template<typename U> struct inUnion {
// Q: where to add typename/template here?
typedef Tail::inUnion<U> dummy;
};
template< > struct inUnion<T> {
};
};
template <typename T> // For the last node Tn.
struct UnionNode<T, void> {
// ...
template<typename U> struct inUnion {
char fail[ -2 + (sizeof(U)%2) ]; // Cannot be instantiated for any …
Run Code Online (Sandbox Code Playgroud) template <int>
using A = int;
void f(A<0>=0); // Attempting to declare a function f taking int,
// with the default argument 0
// Works as expected:
// void f(A<0> = 0);
Run Code Online (Sandbox Code Playgroud)
这既不适用于GCC 4.9.2也不适用于Clang 3.5 - 更不用说ICC或VC++了.显然,该>=
位被解析为大于或等于运算符.但是,对于[temp.names]/3,这似乎是不正确的:
名称查找(3.4)后发现名称是模板名称或者operator-function-id或literal-operator-id引用一组重载函数,其中任何成员都是函数模板,如果遵循此函数通过a
<
,<
始终将其视为template-argument-list的分隔符,而不是less-than运算符. 在解析模板参数列表时,第一个非嵌套>
138被视为结束分隔符而不是大于运算符.[..] [ 例如:Run Code Online (Sandbox Code Playgroud)template<int i> class X { /* ...*/ }; X< 1>2 > x1; // syntax error X<(1>2)> x2; // …
在Rust中声明vector类型的变量或哈希映射时,我们会:
let v: Vec<int>
let m: HashMap<int, int>
Run Code Online (Sandbox Code Playgroud)
要实例化,我们需要调用new()
.但是,我们这样做:
Vec::<int>::new()
^^
HashMap::<int, int>::new()
^^
Run Code Online (Sandbox Code Playgroud)
注意突然出现的::
.来自C++,这些都很奇怪.为什么会这样?是否具有引导::
使IDENTIFIER :: < IDENTFIER …
容易解析比IDENTIFIER < IDENTIFIER
,这可能会被解释为一个小于操作?(因此,这只是让语言更容易解析的一个问题吗?但是如果是这样的话,为什么不在类型规范中这样做,以便让两个镜像相互映射?)
(正如Shepmaster所说,经常Vec::new()
就足够了;通常可以推断出这种类型.)