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

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

你知道吗

int a; 

相当于

 int a[10]; 

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

 std::list &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++ 

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

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

  <% { %> } <: [ :> ] %: # %:%: ## and && bitor | or || xor ˆ compl ~ bitand & and_eq &= or_eq |= xor_eq ˆ= not ! not_eq != 

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

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

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

这样可以正确处理SomeTemplate<::someclass>

这是为没有[ 。的字符集。

§6.4.6-3(C99)

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

 <: :> <% %> %: %:%: 

表现分别与六个令牌相同

 [ ] { } # ## 

处理终端和代码页限制是一个历史性的事情。

阅读关于有向图和三字母的简短维基百科文章 。

它被称为有向图 。 当终端没有C使用的某些字符时,它被用于它。