2013-08-24 2 views
1

У меня есть проблемы с последней Cygwin (1.7.24 64bit, GCC 4.8.1-3 64bit) компилятор в этом шаблоне:C++ Cygwin числовая константа ошибка сборки в шаблоне

template <typename _T, int _N> 
vector<_T> makeVector(const _T(&data)[_N]) { 
    return vector<_T> (data, data + _N); 
} 

Компилятор говорит:

error: expected '>' before numeric constant 

Но я уверен, что это действительный код, потому что я построил его в прошлом на Windows с TDM-GCC и на школьном тестировании Linux.

Если вы знаете, как решить эту проблему, пожалуйста, дайте мне знать, Спасибо.

+0

Это ваш код или код, принадлежащий стандартной библиотеке? ... потому что это ** не ** действительный код пользователя! –

+0

@ DietmarKühl Это неверный код библиотеки, если не используется какое-либо специальное поведение компилятора, поскольку в качестве программиста я имею право делать '#define data 42' перед включением любого из заголовков системы. –

+0

@JamesKanze: Я собирался заявить то же самое, но на самом деле пользователь ** не ** допускал '#define data 42', прежде чем включать какую-либо часть стандартной библиотеки C++, потому что' data' - это имя члена одного из стандартных классов C++ или шаблонов классов (например, 'data' является членом' std :: basic_string' и 'std :: Vector'). То есть, библиотеке фактически разрешено использовать идентификатор 'data'! Ну, не только разрешено - он должен использовать его в некоторых местах. –

ответ

1

Я не могу воспроизвести проблему, возможно, потому что у меня нет Cygwin или системы для запуска Cygwin. Я постараюсь заменить код выше на

#include <vector> 
template <typename T, std::size_t N> 
std::vector<T> makeVector(T (&array)[N]) { 
    return std::vector<T>(array, array + N); 
} 

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

+0

На самом деле вы правы с именами, начинающимися с подчеркивания. Если я изменил его на классическое имя, например, «N», это сработает. Я нашел _N определен как 04 в ctype.h, который включен в исходный код cctype.h. Большое спасибо. – CdTCzech

+0

@CdTCzech: Вы можете использовать опцию '-E' компилятора, чтобы узнать, как выглядит код после предварительной обработки. В коде, который вы отправили на pastebin, я также заметил имена с двумя символами подчеркивания: любое имя, включая два символа подчеркивания (в любом месте), также зарезервировано. –

+0

Очень полезная информация - еще раз спасибо. Я нашел его в файле .o. И я обещаю, что буду избегать имен с подчеркиванием в моих кодах. – CdTCzech

0

Я обнаружил, что _N не может использоваться нами в cygwin, потому что _N, похоже, уже определен как числовая константа. Просто замените N другими именами, такими как N.

Смежные вопросы