为什么我不能编译这段代码?
//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)”
另一个有趣的事情是,如果我将实现放在def.h文件中,它确实编译没有错误。那么def.cpp怎么样?为什么我没有得到错误信息已经定义了函数f(X)?这里不应该应用ODR规则。我所关心的第二个问题是,如果在def.cpp中我将f的返回类型从int更改为double intelliSense,则将此作为错误强调但程序仍然编译?为什么呢?
答案 0 :(得分:1)
只需删除extern
一词即可。无论如何它都是默认值 - 它对函数声明没有任何意义,在任何情况下都应该避免使用C ++。如果你仍然遇到问题,可能def.cpp没有被编译到你的程序中。
答案 1 :(得分:0)
看起来这里没有使用def.cpp。正如您所指出的,如果正在编译def.cpp,它将包含def.h,如果函数是在def.h中定义的,那么这将是一个多函数定义警告或错误。
检查项目设置。