为什么我不能编译这段代码?
//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;
}
我收到 err msg:
Error 2 error LNK2019: unresolved external symbol "int __cdecl f(struct X)"
错误 3 错误 LNK2019:无法解析的外部符号“struct X __cdecl operator*(struct X,struct Y)”
另一个有趣的事情是,如果我将实现放在 def.h 文件中,它确实可以编译而没有错误。那么 def.cpp 呢?为什么我没有收到函数 f(X) 已经定义的错误消息?这里不应该应用 ODR 规则。我担心的第二个问题是,如果在 def.cpp 中我将 f 的返回类型从 int 更改为 double intelliSense 会强调这是一个错误,但程序仍然可以编译?为什么?