Добавление включает в себя причины ошибки компиляции - PullRequest
0 голосов
/ 07 октября 2010

Компиляция с Visual Studio 2005, в Windows XP. Я добавляю следующие заголовки в мой файл "stdafx.h" следующим образом:

#include <atlbase.h>
#include <atlcom.h>
#include <atlcore.h>
#include <atlstr.h>

(технически такая же ошибка появляется только с включенным atlbase.h), которая выдает следующие ошибки:

error C2334: unexpected token(s) preceding '{'; skipping apparent function body    
error C2062: type 'double' unexpected

в следующем коде:

struct CheckValue : public unary_function<pair<MetID,double>,void>{
    CheckValue(double _expected) : m_Expected(_expected){}

    inline void operator()(const pair<MetID,double> &_val){
        m_CheckList.push_back( near( _val.second ) ? 0 : 1 );
    }
    inline bool near(double _val){ //here is location of both errors
        return ( m_Expected - m_Epsilon < _val ) || ( _val < m_Expected + m_Epsilon );
    }

    const static double m_Epsilon;
    const double m_Expected;
    list<int> m_CheckList;
};
const double CheckValue::m_Epsilon = 0.00001;

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

Ответы [ 3 ]

3 голосов
/ 07 октября 2010

Запустите его через препроцессор и посмотрите, что вы получите.Может быть, рядом определено что-то, или какая-то такая проблема.(Трудно сказать без номеров строк)

(я полагаю, что / E или / EP - правильные ключи, но вы можете найти это в опциях VS GUI для отдельного файла тоже ..)

2 голосов
/ 07 октября 2010

near - это макрос, определенный в WinDef.h. Когда вы включаете заголовки ATL, они, вероятно, косвенно включают WinDef.h. Отсюда и ошибка.

Если вам действительно нужны эти заголовки, либо прекратите использовать идентификатор near, либо #undef сразу после включения всех заголовков.

0 голосов
/ 07 октября 2010

Порядок включений может иногда вызывать странные вещи, и действительно, такие "известные ошибки" случались в прошлом с VC ++.Попробуйте перетасовать включения, чтобы посмотреть, поможет ли это.

...