загадочное предупреждение в визуальной студии (4180) - PullRequest
4 голосов
/ 24 ноября 2011
1>c:\program files\microsoft visual studio 10.0\vc\include\map(229): warning C4180: 
     qualifier applied to function type has no meaning; ignored
1>          d:\...\gmproject.h(122) 
            : see reference to class template instantiation 'std::map<_Kty,_Ty>' 
            being compiled
1>          with
1>          [
1>              _Kty=GMProject::DuplicateTy,
1>              _Ty=GMProject::DuplicateFn
1>          ]

Что ж, у моего класса есть следующие typedefs (pTree - контейнер):

typedef void *DuplicateFn(pTree&, const pTree&); 
enum DuplicateTy {
    SKIP,
    OVERWRITE,
    ASK
};

typedef std::map<DuplicateTy, DuplicateFn> DuplicateMapTy;

И строки 122,123:

static const DuplicateMapTy DuplicateFns;
static DuplicateMapTy DuplicateFns_INIT();

Как мне указать, что эта карта можетизменить - и делает это статичным для класса?Моя цель - создать карту, чтобы я мог «получить» указатель на функцию из перечисления.(Клиентский код предоставит перечисление, затем сам класс разрешит перечисление в функцию).

1 Ответ

3 голосов
/ 24 ноября 2011

Эта проблема не имеет ничего общего с константой карты: это предупреждение, потому что возвращаемый тип константной версии std::map::at() равен const mapped_type&. Этот код также выдает предупреждение:

typedef void *DuplicateFn();

typedef std::map< int, DuplicateFn > DuplicateMapTy;

DuplicateMapTy DuplicateFns;

Тип карты повторного запуска at здесь

const DuplicateFn&

Хотя это предупреждение имеет место (хотя я не слишком уверен, что в данной конкретной ситуации оно оправдано стандартом), в этом случае не должно быть никакого вреда, чтобы отключить его локально для кода, использующего карту, или если вам не нравится прагма хлопот, оберните ваш указатель функции в простую структуру.

edit , как указывает Горпик в комментарии ниже, на самом деле это генерируется в этом конкретном месте, хотя функция не используется. Кажется, что компилятор VS довольно агрессивен при поиске предупреждений: он учитывает объявления.

template< class T >
struct CheckMe
{
  const T& at() //warning C4180 pops up
  {
    //gets not instantiated hence no error for missing returntype
  }
};

CheckMe< DuplicateFn > check;
...