Почему я не могу скомпилировать этот код?
//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 подчеркивает это как ошибку, но программа все еще компилируется? Почему?