Объявление члена-функции специализации шаблонного класса
При компиляции MySQL c -std=c++20 получил следующую ошибку: error: expected unqualified-id before ‘)’ token.
Проблемный участок кода:
template<std::size_t N>
class Bitmap { ... };
template<>
class Bitmap<64>
{
public:
Bitmap<64>() { ... };
//........^
};
Так как объявление полной специализации шаблонного класса идентично объявлению обычного класса, то и для объявления членов-функций специализации шаблонного класса должен быть использован обычный синтаксис:
template<>
class Bitmap<64>
{
public:
Bitmap() { ... };
};
К сожалению, я не смог найти в стандарте "прямого" подтверждения (или опровержения) вышесказанному, поэтому прошу вашей помощи.
Я пробовал компилировать этот код GCC и Clang. Последний не выдает ошибок ни с C++17, ни с C++20. GCC с C++17 так же собирает код без ошибок. Интересно, что изменение кода на:
template<>
class Bitmap
{
public:
explicit Bitmap<64>() { ... };
};
приводит к тому, что и GCC перестает выдывать ошибки даже с -std=c++20. Это уже похоже на баг в компиляторе.
Ответы (1 шт):
Кажется, данное описание изменений отвечает на вопрос:
Affected subclauses: [class.ctor] and [class.dtor]
Change: A simple-template-id is no longer valid as the declarator-id of a constructor or destructor.
Rationale: Remove potentially error-prone option for redundancy.
Effect on original feature: Valid C++ 2017 code may fail to compile in this revision of C++. For example:template<class T> struct A { A<T>(); // error: simple-template-id not allowed for constructor A(int); // OK, injected-class-name used ~A<T>(); // error: simple-template-id not allowed for destructor };
Т.е, С++20 требует использовать injected-имя класса для объявления конструктора\деструктора шаблона класса.