warning: narrowing conversion of \'(stride * 4u)\' from \'unsigned int\' to \'WORD {aka short unsigned int}\' inside { } is ill-formed in C++11 [-Wnarrowing]
Look at the definition of D3DVERTEXELEMENT9:
struct D3DVERTEXELEMENT9 {
WORD Stream;
WORD Offset;
BYTE Type;
BYTE Method;
BYTE Usage;
BYTE UsageIndex;
};
(from http://msdn.microsoft.com/en-us/library/windows/desktop/bb172630%28v=vs.85%29.aspx but removed the typedef things).
Thus your are initializing NORMALELEMENT.Offset with stride * sizeof(gs_scalar).
The type of sizeof(gs_scalar) is std::size_t which is apparently unsigned int on your platform, and the type of stride is unsigned (i.e. unsigned int), so the type of stride * sizeof(gs_scalar) is unsigned int. But the type of NORMALELEMENT.Offset is WORD which is unsigned short.
I guess that on your platform unsigned int is 32-bits wide but unsigned short only 16-bits wide, so this is indeed a narrowing conversion (if the value of stride * sizeof(gs_scalar) can't fit in 16 bits you'll lose data).
Even if you define stride as a WORD, it is promoted to unsigned int in the multiplication with sizeof(gs_scalar), so the situation keeps the same.
If you're sure that stride * sizeof(gs_scalar) will never be more than USHRT_MAX (i.e. for you 216−1 i.e. 65535), which seems likely (in the example it's 3 * 4 i.e. 12), then you can use a cast (as said by Troy in the comments), e.g. static_cast.