Рассмотрим следующий фрагмент кода:
struct Foo {};
template<typename ForwardIterator>
struct Foo*
Bar(ForwardIterator first, ForwardIterator last)
{
(void)first;
(void)last;
Foo *foo(nullptr);
return foo;
}
Приведенный выше фрагмент кода отлично компилируется в Clangv3.5 и GCCv4.9.
Однако он не компилируется в VC++2013.
Удаление идентификатора struct
(см. ниже) из возвращаемого типа решает проблему:
struct Foo {};
template<typename ForwardIterator>
Foo*
Bar(ForwardIterator first, ForwardIterator last)
{
(void)first;
(void)last;
Foo *foo(nullptr);
return foo;
}
Q1:
Это баг визуальной студии?
Вопрос 2:
Эта проблема возникла из-за того, что в моей кодовой базе Foo
struct
находится в файле .h.c
(т. е. является C struct
), и для обозначения C/POD struct
в моем коде я использую идентификатор struct
. Является ли это плохой идеей (т.е. в коде C++ я должен избегать использования идентификатора struct
таким образом)?
struct
в чистом коде C++, в частности, если нетprivate
илиprotected
элементов или баз. - person Walter   schedule 05.11.2014struct
противclass
. - person Konrad Rudolph   schedule 05.11.2014struct
исключительно для POD хорошей идеей? (Если не использовать исключительно для этой цели, то все это не имеет смысла.) - person Walter   schedule 05.11.2014struct
иclass
, и что Q2 спрашивает, является ли хорошей идеей использовать префикс использования данного имени структуры с ключевым словомstruct
(как это необходимо сделать в C). - person Konrad Rudolph   schedule 06.11.2014