внешняя проблема - PullRequest
0 голосов
/ 05 мая 2010

Почему я не могу скомпилировать этот код?

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

Ответы [ 2 ]

1 голос
/ 05 мая 2010

Просто удалите слово extern. В любом случае это значение по умолчанию - оно ничего не значит для объявлений функций, и его следует избегать в любом случае в C ++. если у вас все еще есть проблемы, скорее всего, def.cpp не компилируется в вашу программу.

0 голосов
/ 05 мая 2010

Похоже, что def.cpp здесь не используется.Как вы отметили, если def.cpp компилировался, он включает def.h, и если функции были определены в def.h, это было бы предупреждением или ошибкой определения нескольких функций.

Проверьте ваш проектнастройки.

...