簡體   English   中英

對象的范圍解析運算符

[英]Scope resolution operator on object

在 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 ,我想知道是否有任何技巧可以讓我這樣做?

如果您使用 GCC,則有一個 C++11 之前的等效項__typeof__ ,其行為類似。 嘗試:

#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;
}

例子在這里。

或者,如果您可以使用boost ,它會提供Boost.typeof ,它也應該適用於較舊的 Visual C++ 編譯器。

獲取變量的類型正是 c++11 中decltype關鍵字的作用。

decltype(p2.first) a2 = 42;

在 c++11 之前,沒有標准的方法來做到這一點。 有一些特定於編譯器的功能,例如 gcc 的typeof和基於庫的實現,例如 Boost.Typeof,它們在 c++11 之前就已經存在,並且可以做類似的事情。

不需要 C++11 特性,也不需要像 C++03 中的typeof這樣的編譯器擴展,它們是不可移植的。 如果正在使用該變量,則其類型在某處可用 - 假設它是模板或函數簽名中的 T。

然后你可以簡單地typename T::first_type因為pair攜帶其成員類型的成員類型信息(就像許多其他 STL 類,如容器、 string等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM