このコードをコンパイルできないのはなぜですか?
//main
#include "stdafx.h"
#include "X.h"
#include "Y.h"
//#include "def.h"
extern X operator*(X, Y);//HERE ARE DECLARED EXTERNAL *(X,Y) AND f(X)
extern int f(X);
/*GLOBALS*/
X x = 1;
Y y = x;
int i = 2;
int _tmain(int argc, _TCHAR* argv[])
{
i + 10;
y + 10;
y + 10 * y;
//x + (y + i);
x * x + i;
f(7);
//f(y);
//y + y;
//106 + y;
return 0;
}
//X
struct X
{
int i;
X(int value):i(value)
{
}
X operator+(int value)
{
return X(i + value);
}
operator int()
{
return i;
}
};
//Y
struct Y
{
int i;
Y(X x):i(x.i)
{ }
Y operator+(X x)
{
return Y(i + x.i);
}
};
//def.h
int f(X x);
X operator*(X x, Y y);
//def.cpp
#include "stdafx.h"
#include "def.h"
#include "X.h"
#include "Y.h"
int f(X x)
{
return x;
}
X operator*(X x, Y y)
{
return x * y;
}
エラーメッセージが表示されます:
エラー2エラーLNK2019:未解決の外部シンボル "int __cdecl f(struct X)"
エラー3エラーLNK2019:未解決の外部シンボル "struct X __cdecl operator *(struct X、struct Y)"
もう1つの興味深い点は、実装をdef.hファイルに配置すると、エラーなしでコンパイルされることです。しかし、def.cppはどうですか?関数f(X)がすでに定義されているというエラーメッセージが表示されないのはなぜですか?ここでは、ODRルールを適用しないでください。私が抱えている2番目の懸念は、def.cppでfの戻り型をintからdouble intelliSenseに変更した場合、これはエラーとして強調されますが、プログラムはまだコンパイルされますか?なんで?