Ошибка компоновщика при создании проекта Visual C ++ 2008 - PullRequest
0 голосов
/ 05 июля 2018

Недавно мне на работе было поручено попытаться перенести проект C ++ со старого сервера Windws 2003 на Windows 2008. На данный момент я пытаюсь собрать приложение локально, на моем Windows 7PC. Я следовал полученному руководству по установке. Вещи, кажется, работали довольно хорошо. Проблема в том, что после шага компиляции компоновщик выдает мне следующую ошибку:

msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<<struct std::char_traits<char> >(class std::basic_ostream<char,struct std::char_traits<char> > &,char const *)" (??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z) already defined in CellSortTypeIds.obj

Кстати, он запускается в режиме отладки. В режиме релиза я получаю ту же ошибку. Я могу показать вам соответствующий файл CPP:

  1. CellSortTypeIds.h file:

    #ifndef CELL_SORT_TYPE_IDS_H
    #define CELL_SORT_TYPE_IDS_H
    
    #include <iostream>
    
    #include <QtCore/QString>
    
    namespace CellSortTypeIds
    {
        enum CellSortTypeEnum 
        {
            NAME=0, LAC, CI, NB_ITEMS
        };
    
        static const QString mStrings[] = 
        {
            QT_TR_NOOP("Tri par code Nom"), QT_TR_NOOP("Tri par code LAC"), QT_TR_NOOP("Tri par code CI")
        };
    
        QString getQString(const CellSortTypeIds::CellSortTypeEnum aCellSortType);
    
        CellSortTypeEnum getCellSortTypeFromQString( QString aCellSortType );
    }
    
    std::ostream& operator <<(std::ostream &, const CellSortTypeIds::CellSortTypeEnum&); 
    
    #endif //CELL_SORT_TYPE_IDS_H
    
  2. Файл CellSortTypeIds.cpp

    #include "CellSortTypeIds.h"
    #include <QtCore/QObject>
    
    using namespace std;
    
     ostream& operator <<(ostream &out, const CellSortTypeIds::CellSortTypeEnum& aCellSortType)
    {
        out << CellSortTypeIds::getQString(aCellSortType).toAscii().operator const char*();
        return out;
    } 
    
    QString CellSortTypeIds::getQString(const CellSortTypeIds::CellSortTypeEnum aCellSortType)
    {
        QString result("");
    
        if( aCellSortType < CellSortTypeIds::NB_ITEMS )
        {
            result = QObject::tr( CellSortTypeIds::mStrings[aCellSortType].toAscii().data() );
        }
        else
        {
            cerr << __FILE__<< "(" <<__LINE__ << "): mStrings[" << (int)aCellSortType << "] not initialised" << endl;
        }
    
        return result;
    }
    
    CellSortTypeIds::CellSortTypeEnum CellSortTypeIds::getCellSortTypeFromQString( QString aCellSortTypeString )
    {
        CellSortTypeIds::CellSortTypeEnum theEnum( CellSortTypeIds::NAME );
        bool found( false );
    
        for( int index( 0) ; index < CellSortTypeIds::NB_ITEMS && !found ; index++ )
        {
            if( QObject::tr(CellSortTypeIds::mStrings[ index ].toAscii().data()) == aCellSortTypeString )
            {
                theEnum = (CellSortTypeIds::CellSortTypeEnum)index;
                found = true;
            }
        }
    
        return theEnum;
    }
    

Мои знания C ++ не так хороши. Я прочитал несколько сообщений на SO по этой проблеме, некоторые рассказывают о настроенной среде выполнения, некоторые о том, чтобы не определять операторы в заголовочных файлах, а помещать их в файл cpp. Здесь я считаю, что это не так.

Я подозреваю, что в этих двух файлах есть проблема, которую я не могу понять. Любая идея приветствуется. Дайте мне знать, если вам нужно больше деталей. Заранее спасибо, и, пожалуйста, не стесняйтесь давать какие-либо отзывы о структуре вопроса, так как это мой первый вопрос, в конце концов.

1 Ответ

0 голосов
/ 06 июля 2018

Я хотел бы поблагодарить всех за публикацию своих мыслей / опыта. После удаления Visual C ++ 2005, а также его распространяемого пакета у меня больше нет этой проблемы. Я полагаю, что, возможно, возникли некоторые помехи, вызванные этой установкой (возможно, через системные переменные). Сборка запускается и древнее приложение возрождается. Хороших выходных!

...