`
javahigh1
  • 浏览: 1301955 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Template + Type List导致C4002的问题

阅读更多

昨天,为GC的添加了类似于U3的Policy的东西。

我一直很不爽U3的Policy体系,添加一个渲染模块太困难了,同时要修改N个地方,任何一个地方不修改都会导致问题。

GC的Policy使用了Typelist,其中Vertex Assignment使用了如下的Template + Typelist

/*!
*/
class_NullTypeListNode
{
};

template< DWORD Semantic, int SemanticUsage, int index, int Format >
classTVertexAssignNode
{
};

template< typename VAT1, typename VAT2 >
classTGCVertexAssignGroup
{
};


#defineTGC_VERTEX_ASSIGN_GROUP1(T1)TGCVertexAssignGroup< _NullTypeListNode, T1 >
#defineTGC_VERTEX_ASSIGN_GROUP2( T1,T2 )TGCVertexAssignGroup< T1, T2 >
#defineTGC_VERTEX_ASSIGN_GROUP3( T1,T2,T3 )TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP2( T2,T3 ) >
#defineTGC_VERTEX_ASSIGN_GROUP4( T1,T2,T3,T4 )TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP3( T2,T3,T4 ) >
#defineTGC_VERTEX_ASSIGN_GROUP5( T1,T2,T3,T4,T5 )TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP4( T2,T3,T4,T5 ) >
#defineTGC_VERTEX_ASSIGN_GROUP6( T1,T2,T3,T4,T5,T6 )TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP5( T2,T3,T4,T5,T6 ) >

结果……按如下方式调用:

TGC_VERTEX_ASSIGN_GROUP1(TVertexAssignNode<Pos, Pos, 0 , XYZ32> )

居然编译不过!

看了看文档,发现C++对这种宏,展开的是:

+TGC_VERTEX_ASSIGN_GROUP1

+TVertexAssignNode<Pos

+Pos

+0

+XYZ32

而不是

+TGC_VERTEX_ASSIGN_GROUP1

+TVertexAssignNode<Pos,Pos,0 ,XYZ32>

晕死!

文档里说,<>[]都没有被特殊对待,并不会影响“,”的解析,只有“(”在解析里的优先级是高于“,”的。

于是就只能这么写了:

#defineTGC_VERTEX_ASSIGN_NODE(sem,usage,index,format)TVertexAssignNode<sem,usage,index,format>

TGC_VERTEX_ASSIGN_GROUP1(TGC_VERTEX_ASSIGN_NODE(Pos, Pos, 0 , XYZ32) )

倒塌……

不过回头来想想,C++这么做也算是可以理解的,可能有人就想用之下的宏呢:

#define FOO( c, a, b) C##a## b

这样的话要填写一个

FOO( template<F, O, O>)

解析为 template<FOO>

虽然没啥用……

:P

分享到:
评论

相关推荐

    C语言写的双链表list算法

    在C++中,我们有丰富的STL(Standard Template Library)库,其中包括了像`list`这样的数据结构,提供了高效且方便的链表操作。然而,在纯C环境中,我们通常需要自己实现这些高级数据结构和算法。本篇将详细讨论如何...

    C和C++嵌入式系統編程

    3. **STL(Standard Template Library)**:STL提供了容器(如vector、list)、算法和迭代器,大大简化了数据处理和内存管理。 4. **异常处理**:C++的异常处理机制可以帮助编写健壮的代码,处理运行时错误。 5. **...

    [原创]自己工作中常用的模板库,简化你的工作

    It can traverse one TypeList or enum value , then call user's template function by suitable type/enum value. This feature converts runtime data into compile data to meet metaprogramming requirement ...

    华西网源码

    同时将 &lt;script type="text/ecmascript"&gt;hxportal.loadThreadList({fid:2,target:'#sec4_1_c'}); 这个里面的 fid:2 改成你想打开页面默认显示的版块ID 这里的ID 最后修改来和上面第一条的那个ID一样,这样效果更佳 ...

    C++模板中文版及源代码

    - 允许模板接受另一个模板作为参数,例如`template &lt;template &lt;typename&gt; class Container&gt; void process(Container&lt;T&gt; &c);` - 这种情况下的`Container`是模板模板参数,可以接受如`std::vector`或`std::list`等...

    C++模板

    struct TypeList {}; ``` #### 六、模板与泛型编程 模板是C++中实现泛型编程的基础。泛型编程的核心思想是在不知道具体类型的情况下编写代码,从而达到代码重用的目的。模板为C++提供了这一能力,使得我们可以...

    float元素浮动后高度不一致导致错位的解决办方法

    list-style-type: none; font-size: 0; /* 父元素的字体大小设为0 */ } ul li { width: 160px; display: inline-block; vertical-align: top; /* 保证顶部对齐 */ font-size: 12px; /* 子元素恢复字体大小 *...

    freemarker总结

    上面的代码中的逻辑表达式用括号括起来主要是因为里面有&gt;符号,由于FreeMarker会将&gt;符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号. Pythons are ...

    C++编程思想大全

    1. **基础语法**:C++起源于C语言,因此保留了C语言的大部分语法特性,如变量声明、类型系统、运算符优先级等。同时,C++增加了类(class)的概念,这是面向对象编程的基础。 2. **面向对象编程(OOP)**:C++支持...

    C++程序设计ppt

    5. **STL(Standard Template Library)**: STL是C++标准库的一部分,包含容器(如vector、list、map等)、算法和迭代器,极大地提高了代码的效率和可读性。 6. **内存管理(Memory Management)**: C++提供了动态...

    TemplateStudy:C++模板学习

    在C++编程语言中,模板(Template)是一个强大的特性,它允许我们编写泛型代码,实现数据类型的通用性。模板可以应用于类(Class Templates)和函数(Function Templates),使得我们能够编写一次代码,就能适用于多...

    嵌入式软件面试题整理.pdf

    在C++中,使用 `extern "C"` 来声明函数或变量时,会告诉编译器这些函数或变量按照C语言的方式进行链接,而不是C++的名称修饰(name mangling)。这通常用于C++程序调用C库或在C++代码中包含C库头文件时。 #### ...

    EditPlus 2整理信箱的工具

    这是因为 EditPlus 的语法是设置文件采用的是绝对路径,而在你设置了语法文件之后,再把程序复制到其它目录,因而导致 EditPlus 无法找到该语法文件。 解决办法: 在主程序目录里,找到 Setting.ini 这是 EditPlus ...

    Editplus 3[1].0

    这是因为 EditPlus 的语法是设置文件采用的是绝对路径,而在你设置了语法文件之后,再把程序复制到其它目录,因而导致 EditPlus 无法找到该语法文件。 解决办法: 在主程序目录里,找到 Setting.ini 这是 EditPlus ...

    新手学习C++入门资料

    表达式的前缀(int*)就是传统C风格的强制类型转换说明(typecast),又可称为强制转换说明(cast)。强制转换说明告诉编译器把表达式转换成指定的类型。有些情况下强制转换是禁用的,例如不能把一个结构类型转换成其他...

    入门学习Linux常用必会60个命令实例详解doc/txt

    因为Linux与Windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失,使系统处于不稳定的状态,甚至在有的系统中会损坏硬件设备(硬盘)。在系统关机前使用 shutdown命令,系统管理员会通知所有...

    双谷网关于IT行业软件开发常用英语词汇大全.docx

    - **Definition**: 程序中存在的导致不正确行为的问题。 **Build 编连(专指编译和连接)** - **Definition**: 将源代码转化为可执行程序的过程。 **Built-In 建、置** - **Definition**: 内置于编程语言或环境中...

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

Global site tag (gtag.js) - Google Analytics