Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Вопрос про специализацию и шаблонны классы со статическими данными

#cpp #cpp11 #шаблоны_с++


допустим есть шаблонный класс: 

template
class X
{
public:
    static T t;
    static T foo()
    {
        return t;
    }
};


В чём разница между такой инициализацией статического члена t

double X::t = 5.0f;


и такой инициализацией со специализацией класса (или статического члена !?) ?

template<>
double X::t = 5.0f;

    


Ответы

Ответ 1



Оба синтаксиса формально корректны, но первый не применим в данном контексте. У вас есть возможность использовать четыре относительно "похожих" синтаксиса за пределами определения самого шаблонного класса // 1 template T 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; является невалидной и вызовет ошибку компиляции.

Комментариев нет:

Отправить комментарий