不是 class 或结构名称 _D3DCOLORVALUE

Not a class or struct name _D3DCOLORVALUE

正在编写图像查看器和转换器。 _D3DCOLORVALUE 在 d3d8types.h 文件中定义。我正在使用 DirectX 8 SDK。如果我用 _D3DCOLORVALUE 定义一个结构,就会发生一些这样的错误:

1. error C2504: '_D3DCOLORVALUE' : base class undefined
2. error C2061: syntax error : identifier '_D3DCOLORVALUE'
3. _D3DCOLORVALUE not a class or struct name

可能是什么问题?

注意:这个项目在 VB6 上完美运行,但我尝试在 VS2012 上构建它

My3DStruct.h

#include "d3d8types.h"

struct __ColorValue : public _D3DCOLORVALUE //problem is here
{
public:
    void operator = (const D3DCOLORVALUE& cv) { r = cv.r; g = cv.g; b = cv.b; a = cv.a; }
    void operator = (D3DCOLOR cr) { r = ((cr & 0x00ff0000)>>16)/255.0f; g = ((cr & 0x0000ff00)>>8)/255.0f; b = (cr & 0x000000ff)/255.0f; a = ((cr & 0xff000000) >> 24)/255.0f; }
    void Set(float r2, float g2, float b2, float a2) { r = r2; g = g2; b = b2; a = a2; }

    D3DCOLOR ToD3DCOLOR() { return  (((DWORD)(a*255.0f))<<24) | (((DWORD)(r*255.0f))<<16) | (((DWORD)(g*255.0f))<<8) | (((DWORD)(b*255.0f))); }

    __ColorValue() {}
    __ColorValue(D3DCOLOR cr) { *this = cr; }
    __ColorValue(float r2, float g2, float b2, float a2) { this->Set(r2, g2, b2, a2); }

    void operator += (float fDelta) { r += fDelta; g += fDelta; b += fDelta; a += fDelta; }
    void operator -= (float fDelta) { r -= fDelta; g -= fDelta; b -= fDelta; a -= fDelta; }
    void operator *= (float fDelta) { r *= fDelta; g *= fDelta; b *= fDelta; a *= fDelta; }
    void operator /= (float fDelta) { if(0 == fDelta) return; r /= fDelta; g /= fDelta; b /= fDelta; a /= fDelta; }

    D3DCOLORVALUE operator + (float fDelta) { __ColorValue cv = *this; cv.r += fDelta; cv.g += fDelta; cv.b += fDelta; cv.a += fDelta; return cv; }
    D3DCOLORVALUE operator - (float fDelta) { __ColorValue cv = *this; cv.r -= fDelta; cv.g -= fDelta; cv.b -= fDelta; cv.a -= fDelta; return cv; }
    D3DCOLORVALUE operator * (float fDelta) { __ColorValue cv = *this; cv.r *= fDelta; cv.g *= fDelta; cv.b *= fDelta; cv.a *= fDelta; return cv; }
    D3DCOLORVALUE operator / (float fDelta) { __ColorValue cv = *this; cv.r /= fDelta; cv.g /= fDelta; cv.b /= fDelta; cv.a /= fDelta; return cv; }

    void operator += (const D3DCOLORVALUE& cv) { r += cv.r; g += cv.g; b += cv.b; a += cv.a; }
    void operator -= (const D3DCOLORVALUE& cv) { r -= cv.r; g -= cv.g; b -= cv.b; a -= cv.a; }
    void operator *= (const D3DCOLORVALUE& cv) { r *= cv.r; g *= cv.g; b *= cv.b; a *= cv.a; }
    void operator /= (const D3DCOLORVALUE& cv) { r /= cv.r; g /= cv.g; b /= cv.b; a /= cv.a; }

    D3DCOLORVALUE operator + (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 += cv; return cv2; }
    D3DCOLORVALUE operator - (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 -= cv; return cv2; }
    D3DCOLORVALUE operator * (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 *= cv; return cv2; }
    D3DCOLORVALUE operator / (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 /= cv; return cv2; }
};

d3d8types.h

#ifndef D3DCOLORVALUE_DEFINED
typedef struct _D3DCOLORVALUE {
    float r;
    float g;
    float b;
    float a;
} D3DCOLORVALUE;
#define D3DCOLORVALUE_DEFINED
#endif

所有以两个下划线(__)开头的标识符都是reserved in C++;你不应该在任何地方将它们用于你自己的代码。

您应该使用 D3DCOLORVALUE 而不是 _D3DCOLORVALUE。 DirectX 8 SDK 现在已经很老了,但由于您使用的是那个旧版本,您可以查看我的免费书籍 The Direct3D Graphics Pipeline that is a mix of DirectX 8/9. Even with the mix in there, that material should be useful to you when using this old a version of DirectX. Chapter 1,其中讨论了 D3DCOLORD3DCOLORVALUE。您使用 DirectX 8 是因为您正在转换 VB6 代码,而 Direct3D 8 是最后一个 API 暴露给 VB 的代码吗?移植时最好使用 Direct3D 9。 Direct3D 10、11 和 12 与 9 有很大不同,但 9 与 8 和 8.1 大部分相似。

成语typedef struct _X X; 是C 主义,因为C 不将结构名称识别为完整类型。在 C 中,你必须到处写 struct X,因此常用的习惯用法是将真正的结构作为名称 _X 引入,并将 X 作为 struct _X 的同义词引入typedef。所有这些在 C++ 中都是无害的,但也完全没有必要。在 C++ 中,说 struct X 意味着您可以在任何需要的地方使用 X 作为类型,而不必强迫您编写 struct X 或使用 typedef.

看起来您只是想通过在 ColorValue 结构上创建 operator+ 成员来提供用于操纵颜色值的语法糖。您不需要从 D3DCOLORVALUE 派生来实现此目的;只需将运算符定义为具有适当类型的自由函数:

inline D3DCOLORVALUE &operator+(D3DCOLORVALUE &lhs, float delta)
{
    lhs.r += delta;
    lhs.g += delta;
    lhs.b += delta;
    lhs.a += delta;
    return lhs;
}

我相信微软自己在某个时候将结构上的这种自由函数或成员函数引入到SDK中。我不记得是哪个版本引入的,但可能是在 DirectX 8 之后。

最后,编写自己的 类 派生自 value types like D3DCOLORVALUE. These are simple structures that don't have virtual destructors and deriving from them leaves you susceptible to object slicing errors. I recommend instead that you prefer aggregation over inheritance 通常不是一个好主意。

如果您的唯一动机是在 D3DCOLORVALUE 值上获得良好的 operator+ 行为,那么我建议使用自由函数方法而不是推导。