Jump to content
  • Advertisement
Sign in to follow this  
Eddycharly

problem with template

This topic is 4447 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi. I just spent one hour hunting a very stupid bug in my code. The problem was that a template parameter and a structure in my code had the same name. The compiler didn't say anything but it was making a confusion. I can change the name but it's not very elegant, the more i had new structures in my code, the more i risk to face the problem again. Here what was the problematic code : I have a class wrapper class that encapsulates D3D, one of the methods in it is : template <typename VERTEX> bool DrawTriangles (const VERTEX * const verts, const unsigned int num_verts) { if (d3d9_device) { d3d9_device->BeginScene (); d3d9_device->SetFVF (VERTEX::VERTEX_FORMAT); d3d9_device->DrawPrimitiveUP (D3DPT_TRIANGLELIST, num_verts / 3, verts, sizeof (VERTEX)); d3d9_device->EndScene (); } return true; } And somewhere else, i have a structure named VERTEX. I also have a structure named QUAD_VERTEX i use for rendering transformed vertices. Now, when i was sending vertices of the type QUAD_VERTEX to the DrawTriangles method, instead of substituting the template parameter named VERTEX to the QUAD_VERTEX type, and then use QUAD_VERTEX::VERTEX_FORMAT to set the FVF, it was using VERTEX::VERTEX_FORMAT. Of course VERTEX::VERTEX_FORMAT exists because of the VERTEX structure, but it's not at all what i wanted to code. When i wrote d3d9_device->SetFVF (VERTEX::VERTEX_FORMAT); i wanted VERTEX to refer to the template parameter. I find it very strange that the preference is not given to the template parameter, and at least my compiler should warn me about a possible conflict. Is this a bug in the compiler ? Is there something i can do in my code to prevent this to happen again ? I hope someone can help me here. I would really apreciate it. Thanks in advance.

Share this post


Link to post
Share on other sites
Advertisement
struct Test1
{
static const int val = 1;
};
struct Test2
{
static const int val = 2;
};

template<typename Test1>
void test_mbox(Test1 * pt)
{
if (Test1::val == 1)
MessageBox(NULL, "1", "test_mbox", MB_OK);
else if (Test1::val == 2)
MessageBox(NULL, "2", "test_mbox", MB_OK);
else
MessageBox(NULL, "undefined", "test_mbox", MB_OK);
};

// calling with:
Test2 t2;
test_mbox(&t2);


Output (on VS 2003):
2

So the substitution was done correctly.
What compiler are you using?

Share this post


Link to post
Share on other sites
Thanks for making the test.

I use VC6, i know it's a very bad compiler regarding templates support, but i thought it could handle such a simple case correctly.
There's nothing fancy here, no specialization, etc...

I took your code and ran it, and guess what? my output is 1...
Then i replaced the template parameter name by TestXXX, and the ouput is 2.

I suppose it's time to upgrade to a more recent version.
Thanks.

PS: is it legal to initialize a static structure member directly in the structure declaration ? i thought no, and VC6 complained about that. i had to use enums instead.

Once again, thanks.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!