0

为什么我不能编译这段代码?

   //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 会强调这是一个错误,但程序仍然可以编译?为什么?

4

2 回答 2

1

只需删除这个词extern。无论如何,它是默认值——它对函数声明没有任何意义,在 C++ 中无论如何都应该避免它。如果您仍然遇到问题,则很可能 def.cpp 没有被编译到您的程序中。

于 2010-05-05T15:32:54.070 回答
0

看起来 def.cpp 没有在这里使用。正如你所指出的,如果 def.cpp 正在编译,它包括 def.h,如果函数是在 def.h 中定义的,那将是一个多函数定义警告或错误。

检查您的项目设置。

于 2010-05-05T15:56:05.190 回答