struct と class はマングリングが異なるので混同してはいけない。

BCC では大丈夫だったので、不完全な struct の宣言にも class を使う習慣になってしまっていたのですが、VC ではリンク時にエラーになります。

一つ目のモジュール

struct Foo {
};

Foo* CreateFoo()
{
    return new Foo;
}

void PrintFoo(const Foo&)
{
}

二つ目のモジュール

class Foo; // 問題の不完全な宣言
Foo* CreateFoo();
void PrintFoo(const Foo&);

int main()
{
    Foo* foo = CreateFoo();
    PrintFoo(*foo);
    delete foo;
}

コンパイルしてリンクするとエラー

error LNK2019: 未解決の外部シンボル "class Foo * __cdecl CreateFoo(void)" (?CreateFoo@@YAPAVFoo@@XZ) が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル "void __cdecl PrintFoo(class Foo const &)" (?PrintFoo@@YAXABVFoo@@@Z) が関数 _main で参照されました。

class と struct を入れ替えて(デフォルト コンストラクタとデストラクタも必要)エラーメッセージを見ると、マングル後が1文字違うのがわかります。

error LNK2019: 未解決の外部シンボル "struct Foo * __cdecl CreateFoo(void)" (?CreateFoo@@YAPAUFoo@@XZ) が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル "void __cdecl PrintFoo(struct Foo const &)" (?PrintFoo@@YAXABUFoo@@@Z) が関数 _main で参照されました。

class Foo が ...VFoo... で、struct Foo が ...UFoo... です。