#cpp #cpp11 #шаблоны_с++
допустим есть шаблонный класс: templateclass X { public: static T t; static T foo() { return t; } }; В чём разница между такой инициализацией статического члена t double X ::t = 5.0f; и такой инициализацией со специализацией класса (или статического члена !?) ? template<> double X ::t = 5.0f;
Ответы
Ответ 1
Оба синтаксиса формально корректны, но первый не применим в данном контексте. У вас есть возможность использовать четыре относительно "похожих" синтаксиса за пределами определения самого шаблонного класса // 1 templateT X ::t; // "Общее" определение статического члена. // Является определением независимо от наличия инициализатора. // 2 template<> double X ::t = 3; // Явная специализация статического члена для `T == double`. // Является определением только при наличии инициализатора. Без инициализатора // является просто объявлением. // Определения, предоставленные методом 1, не распространяются на явные // специализации, т.е. определение для явной специализации требуется // предоставить отдельно. // 3 template double X ::t; // Явное инстанцирование статического члена для `T == double`. // Не допускает указания инициализатора. // Может выполняться только после выполнения определения или явной // специализации. В последнем случае - не имеет никакого эффекта. // 4 double X ::t = 3; // Определение статического члена явной специализации. // Является определением независимо от наличия инициализатора. // Требует, чтобы явная специализация шаблона класса была определена выше. Все эти синтаксические конструкции единообразно распространяются и на объявления методов класса. В данном случае, однако, мы говорим именно о статических данных. Таким образом ваше первое объявление будет являться корректным в том и только в том случае, если оно следует за определением явной специализации шаблона класса X для T == double template class X { public: static T t; }; template<> class X { public: static double t; }; double X ::t = 5.0f; Но без явной специализации шаблона класса, как в вашем конкретном примере, такое объявление неуместно. Ответ 2
Да, разница существенна, запись double X::t = 5.0f; является невалидной и вызовет ошибку компиляции.
Комментариев нет:
Отправить комментарий