Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++_C++11 - Fatal编程技术网

C++ 为什么访问嵌套类型会影响C++;?

C++ 为什么访问嵌套类型会影响C++;?,c++,c++11,C++,C++11,假设我有一个简单的结构 struct A { std::vector<uint32_t> v; }; 错误消息 示例.cpp:18:44:错误:“A”中没有名为“v”的成员 为什么第三个版本失败了?我不明白添加另一层范围解析是如何导致更广泛的范围解析失败的。事实上,第二个例子似乎相当于失败的例子,但显然编译器不同意 这是一个假设/语言问题。我不想解决向量大小的特殊问题,但rahter理解这种语言的奇怪之处 更新 下面是另一个例子,来自下面的答案,这似乎进一步加深了我的困惑

假设我有一个简单的结构

struct A {
    std::vector<uint32_t> v;
};
错误消息

示例.cpp:18:44:错误:“A”中没有名为“v”的成员

为什么第三个版本失败了?我不明白添加另一层范围解析是如何导致更广泛的范围解析失败的。事实上,第二个例子似乎相当于失败的例子,但显然编译器不同意

这是一个假设/语言问题。我不想解决向量大小的特殊问题,但rahter理解这种语言的奇怪之处

更新

下面是另一个例子,来自下面的答案,这似乎进一步加深了我的困惑

sizeof(decltype(A::v)::value_type);  // legal  

decltype(A::v)::value\u type
在这种上下文中与
A::v::value\u type
有何不同?

如果我错了,请纠正我,但最后一个实例没有失败,因为您在最后一个实例中访问实例,而在第二个实例中,您从decltype()获取类名。如果将第三个包装在decltype中,它就可以工作

sizeof(decltype(A::v)::value_type); 

我认为不能使用::标记从变量中获取类型名。忽略sizeof并忽略A::v。以下操作不起作用:

A a; // A is some type with a public typedef for value_type in its declaration
A::value_type b; // ok
a::value_type c; // error
GCC 4.7.1给出了以下错误:

x.cpp:9:1: error: 'a' does not name a type

sizeof之所以让人困惑,只是因为它是一个编译时构造,同时接受类型和变量作为参数。

那么为什么第一个可以工作呢?但是你碰到了我的问题的突出部分,为什么是代码> DECKType(A::v):ValueEyType < /C> >不同于<代码>::::ValueEyType < /C>?你的问题是为什么C++不让它工作为什么A::v和DeCype(A:V)微分都猜测。我试图理解我所感知到的微妙的不一致性。
decltype(A::v)::value\u type
可以,但是
A::v::value\u type
会导致编译器报告
v
突然不存在。您可以使用decltype创建类的新实例,但不能使用A::v创建新实例。INTA;decltype(a)b@AndrewWhite简单回答:因为
v
不是一个类型,所以不能对其应用范围运算符(
),此时与
sizeof
无关。实际的区别在于
sizeof(a::v)
sizeof(decltype(a().v))
之间,而实际的问题应该是为什么前者有效,即使
a::v
没有命名类型。但是这就是sizeof的工作原理,它同时接受类型和变量名。但我仍然有一个谜,在我的示例中,为什么添加
::value_type
会导致
a
中找不到
v
?@AndrewWhite,因为
::
运算符会导致编译器查找名称空间(实际名称空间或复合类型(结构/类/联合))。
A
中没有名为
v
的名称空间
x.cpp:9:1: error: 'a' does not name a type