C中的<:语法有什么意义?

Che*_*ath 4 c c++ gcc

可能重复:
<:无法开始模板参数列表

你知道吗

int a<:10:>;
Run Code Online (Sandbox Code Playgroud)

相当于

int a[10];
Run Code Online (Sandbox Code Playgroud)

我正在编写一些代码,其中我有一个全局命名空间和一个受限制的命名空间,现在说NS1.我在我的全局命名空间中有一个名为Module的类,我在NS1中导入了一些其他库,它们也有一个名为Module的类.我试图创建我的模块的std :: list,即在NS1中的一个函数内部的:: Module,这样做,我得到了这个编译错误

std::list<::Module*> &myModule;

genllvm.cpp:60:11: error: ‘<::’ cannot begin a template-argument list
./genllvm.cpp:60:11: note: ‘<:’ is an alternate spelling for ‘[’. Insert whitespace between ‘<’ and ‘::’
./genllvm.cpp:60:11: note: (if you use ‘-fpermissive’ G++ 
Run Code Online (Sandbox Code Playgroud)

这个"<:"语法有什么意义?

fef*_*efe 11

它的召唤替代令牌.C++有几个:

 <%     {
 %>     }
 <:     [
 :>     ]
 %:     #
 %:%:   ##
 and    &&
 bitor  |
 or     ||
 xor    ˆ
 compl  ~
 bitand &
 and_eq &=
 or_eq  |=
 xor_eq ˆ=
 not    !
 not_eq !=
Run Code Online (Sandbox Code Playgroud)

您可以看到一些替代令牌由字母组成.所以你可以编写if (a<b and b<c)一个可以正确处理它们的编译器.它们的存在是因为键盘或字符集中缺少符号.替代标记永远不会被主要标记替换(与三字母不同),但它们的行为与主要标记相同.

但是,C++ 0x需要特殊处理<::(2.5p3):

否则,如果接下来的三个字符是<::且后续字符既不是:nor>,则<被视为预处理器标记本身而不是备用标记<:的第一个字符.

这样SomeTemplate<::SomeClass>才能正确处理.

  • +用于c ++ 11洞察力 (2认同)

cni*_*tar 8

它适用于没有的字符集[.

§6.4.6-3(C99)

在语言的各个方面,六个令牌

<: :> <% %> %: %:%:
Run Code Online (Sandbox Code Playgroud)

行为分别与六个令牌相同

[  ]  {  }  #  ##
Run Code Online (Sandbox Code Playgroud)

  • 或者对于缺少它们的字符集来说可能更多.在7位字符集的时代回来了.{} \] \和其他一些人经常被特定于语言环境的变音符号所取代.为了在使用瑞典语计算机时不必编写aä2å,您可以在C中使用alernate格式<:2:>(Pascal中的a(.2.)),这至少稍微更具可读性. (3认同)