У меня есть следующий фрагмент кода, который не компилируется в Visual С++ 2015, но работает под GCC 4.8.4. Мне интересно, что правильно? Ниже приведен код:
template <class T> class ATemplate;
template <class R, class A1>
struct ATemplate<R(A1)>{ };
int main()
{
ATemplate<void(int)> x;
// ATemplate<void(int)override> y; //---Does not compile!!!
return 0;
}
Неправильно ли использовать переопределить как спецификатор ниже (или const). Подобный код существует в библиотеке GMock, где расширение макроса используется для генерации параметра шаблона (включая переопределение), а также фактической сигнатуры функции.
Visual С++ 2015 выдает следующую ошибку при удалении пропущенной строки:
x.cpp(11): error C2062: type 'int' unexpected
x.cpp(11): error C2976: 'ATemplate': too few template arguments
x.cpp(4): note: see declaration of 'ATemplate'
x.cpp(11): error C2079: 'y' uses undefined class 'ATemplate'
В одном из приведенных ниже ответов упоминается, что переопределение бессмысленно в контексте свободных функций (действительная точка) - означает ли это, что GCC здесь не так. Спецификатор const также не имеет смысла в этом случае (для бесплатных функций), но тем не менее разрешен (по VС++)??? Кроме того, в нем упоминается, что виртуальные спецификаторы должны присутствовать только в объявлении - это не имеет никакого отношения к этому случаю (поскольку определение отсутствует). Для ключевого слова virtual, это нормально, чтобы пропустить в производном, поскольку не имеет никакого значения, компилируется ли код, но для случая переопределения это не нормально, так как это имеет большое значение.
При использовании метода ReturnType (ArgType arg)... возможного const или переопределить спецификатор в качестве параметра макроса (например, GMock) ограничение, налагаемое VCC, приводит к тому, что этот код не компилируется (очевидно, для Clang тоже). Что правильно?
В стандарте не указано, что спецификатор переопределения не должен использоваться в этом контексте (контекст параметра шаблона?), не так ли?