2012-03-31 66 views
0

内成员变量的偏差是有可能有此代码的工作不知何故? (目前得到一个编译错误,指出MMVertex2F4B2F不存在) 我不想包裹2另一个结构之内,将我现有的代码中实现类的可用性。参考POD声明

我需要这一切在编译时有发生,本质上是TemplatedClass需要保存的数据有关它的,我可以通过创建TemplatedClass的实例后访问外部类。

struct MMVertex2F4B2F 
{ 
    MMPoint vertex; 
    MMColor4B col; 
    MMPoint tex; 

    struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {}; 
}; 

问候, 詹姆斯

+0

使用'结构MMVertex2F4B2F',而不是'MMVertex2F4B2F' – twain249 2012-03-31 22:17:48

回答

1

,你可以把你的主类的数据转换为子类型:

struct MMVertex2F4B2F 
{ 
    struct MMVertexData { 
    MMPoint vertex; 
    MMColor4B col; 
    MMPoint tex; 
    } Data; 
    struct TemplatedClass<offsetof(MMVertexData, vertex)> {}; 
}; 

(如果你通过成员方法来访问数据成员,你只必须适应那些对这种变化,而不是所有的代码)

另外,该TemplatedClass<>可以宣布独立(没有一分型)■类似于特征模板。

,你的代码不工作表明,它的设计是有缺陷的事实。

+0

谢谢您的回答,在另一个结构包裹会打破的用法整个代码库的其余部分。 – user1103741 2012-04-01 18:17:23

1

注意

struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {}; 

是无效的C++代码。无论这是一个模板专业化,这将是

template <> struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {}; 

(这似乎并不像它会对此作出太大意义),这是应该是模板的实例的声明,这将是

TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> myInstanceVar; 

至于其他,我同意沃尔特的答案。

+0

感谢您的回答。我想要一个结构声明,我可以稍后在代码中进行实例化。 – user1103741 2012-04-01 18:23:08

0

offsetof宏是从C继承而来的,它可以与POD结构一起工作,但它不是在C++中引用成员的最佳方法。在指向成员的参数化模板上。

template< typename client, MMPoint client ::* > // PTM parameter 
struct TemplatedClass { 
    … 
}; 

struct MMVertex2F4B2F 
{ 
    MMPoint vertex; 
    MMColor4B col; 
    MMPoint tex; 

    // PTM argument acceptable despite incomplete class: 
    TemplatedClass<MMVertex2F4B2F, & MMVertex2F4B2F::vertex> template_inst; 
}; 

在本例中的模板接受任何指定的类中的一个指针MMPoint类型的构件。您可能会使用其他参数化。任何事情都比字节偏移更好,并通过char *投射。

+0

我正在使用它来设置偏移到用于openGL的顶点缓冲区,所以我需要偏移量的值是一个整数以传递到各种设置方法。谢谢你的回答。 – user1103741 2012-04-01 18:19:36

+0

@ user1103741您也可以使用指向成员参数的指针来滚动自己的'offsetof'模板函数。这仍然会打破循环依赖并仍然会产生一个整数。 – Potatoswatter 2012-04-02 04:44:50

0

睡在它之后,我来到了这个解决方案,它似乎工作:

struct MMVertex2F4B2F 
{ 
    MMPoint vertex; 
    MMColor4B col; 
    MMPoint tex; 

    struct TemplatedClass; //Use a forward declaration here 
}; 

//The template will now work as MMVertex2F4B2F is fully declared 
struct MMVertex2F4B2F::TemplatedClass 
     : public VertDef <offsetof(MMVertex2F4B2F, vertex)> {}; 
+0

这不能工作。你正在定义一个模板,而不使用'template'关键字。 – Potatoswatter 2012-04-02 04:43:20

+0

是的我的错误应该是: struct MMVertex2F4B2F :: TemplatedClass:public VertDef {}; – user1103741 2012-04-08 12:11:51

+0

我点击“编辑”并将你的评论复制粘贴到你的答案中。但是,同样的错字是阻止我们回答你的问题。我不确定是投票还是降低投票。 – Potatoswatter 2012-04-08 12:42:39