2013-05-08 81 views
3

假设我有一个简单的结构......为什么访问嵌套类型会影响C++中的成员分辨率?

struct A { 
    std::vector<uint32_t> v; 
}; 

而且我想要找的矢量元素类型的大小...

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

错误信息......

example.cpp:18:44: error: no member named 'v' in 'A'

为什么第三个版本失败?我不明白如何添加另一层作用域分辨率会导致更宽泛的作用域分辨率失败。事实上,第二个例子看起来与失败的例子相同,但显然编译器不同意。

这是一个假设/语言问题。我并非试图解决矢量大小的特定问题,而是更明白这种语言的这种古怪。

更新

这里是从下面这似乎进一步我的困惑回答另一个例子......

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

如何是在这种背景下A::v::value_typedecltype(A::v)::value_type不同?

回答

6

我不认为你可以使用::令牌变量获得类型名。忽略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使得这只是混乱,因为它是接受这两种类型和变量作为一个编译时间结构参数。

+0

观察的大小很有趣。但我仍然有一个谜,在我的例子中,为什么添加':: value_type'导致'v'在'A'中找不到? – 2013-05-08 03:30:56

+1

@AndrewWhite因为'::'操作符使编译器查找命名空间(实际命名空间或复合类型(结构/类/联合))。在'A'中没有名为'v'的命名空间 – larvyde 2013-05-08 04:17:40

3

纠正我,如果我错了,但最后一个失败,因为你正在访问最后一个实例,而在第二个,你从decltype()获得类名称。如果换在decltype第三个它的工作原理

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

那么为什么第一个工作?但是你突出了我的问题,为什么'decltype(A :: v):: value_type'与'A :: v :: value_type'不同? – 2013-05-08 02:59:55

+0

是你的问题更多为什么C++不能使它工作比为什么A :: v和decltype(A :: v)不同 – aaronman 2013-05-08 03:10:56

+0

我猜都是。我想了解我认为的微妙的不一致性。 'decltype(A :: v):: value_type'如何可以,但'A :: v :: value_type'会导致编译器报告'v'突然不存在。 – 2013-05-08 03:17:18