对象的范围解析运算符

时间:2016-04-27 09:14:22

标签: c++ operators c++03 type-resolution

在C ++中,我们有一个operator::,它允许我们这样做:

typedef std::pair<A, B> pairAB;
pairAB p;

pairAB::first_type a(42);
pairAB::second_type b("hello world");

p.first = a;
p.second = b;

我试图在这种类型的对象上使用此运算符:

pairAB p2;

p2::first_type a2(42);
p2::second_type b2("hello again");

p2.first = a2;
p2.second = b2;

编译器向我展示了error: C2510: 'p2' : left of '::' must be a class/struct/union,我想知道是否有任何技巧可以让我这样做?

3 个答案:

答案 0 :(得分:1)

如果您正在使用GCC,那么有一个名为__typeof__的前C ++ 11等效项,其行为类似。尝试:

#include <string>

int main()
{
  typedef std::pair<int, std::string> pairAB;
  pairAB p2;

  __typeof__(p2.first) a2 = 42;
  __typeof__(p2.second) b2 = "hello again";

  p2.first = a2;
  p2.second = b2;
}

Example here.

或者,如果您可以使用boost,则它提供Boost.typeof,它也适用于较旧的Visual C ++编译器。

答案 1 :(得分:1)

获取变量的类型正是c ++ 11中query.setParamter("fist_name", "%name%"); 关键字的用途。

decltype

在c ++ 11之前,没有标准的方法可以做到这一点。有一些编译器特定的功能,例如gcc的decltype(p2.first) a2 = 42; 和基于库的实现,例如Boost.Typeof,它们在c ++ 11之前就存在并且做了类似的事情。

答案 2 :(得分:-1)

C ++ 03中不需要C ++ 11特性和编译器扩展,如typeof,这些扩展不可移植。如果正在使用该变量,则其类型在某处可用 - 例如,它在模板或函数签名中为T.

然后你可以简单地typename T::first_type,因为pair携带自己的成员类型的成员类型信息(与容器,string等许多其他STL类一样)。