#visual-c
Вопрос:
при компиляции существующего кода с использованием GCC я получил ошибку non-class, non-variable partial specialization ‘make_buffer<size>’ is not allowed
.
Сводный код будет выглядеть так (один cpp):
#include <array>
template <typename T, size_t size>
std::array<T, size> make_typed_buffer()
{
return std::array<T, size>();
}
template <size_t size>
std::array<char, size> make_buffer();
template <size_t size>
std::array<char, size> make_buffer<size>()
{
return make_typed_buffer<char, size>();
}
Этот код прекрасно компилируется с MSVC 19.29.30038.1, но не с GCC.
Когда я удаляю прямое объявление функции шаблона:
#include <array>
template <typename T, size_t size>
std::array<T, size> make_typed_buffer()
{
return std::array<T, size>();
}
//template <size_t size>
//std::array<char, size> make_buffer();
template <size_t size>
std::array<char, size> make_buffer<size>()
{
return make_typed_buffer<char, size>();
}
Я получаю ошибку unrecognizable template declaration/definition
(чего я и ожидал в первую очередь). Почему компилятор в порядке с прямым объявлением, но не без него, и, может быть, почему это вообще нормально в первую очередь?
Заранее спасибо, хорошего дня 🙂
Комментарии:
1. Является ли это недокументированным расширением Microsoft?
2. @AdrianMole После прочтения docs.microsoft.com/en-us/cpp/build/reference/… интересно, может ли это быть частью
Use of benign typedef redefinitions within the same scope