Информация об изменениях

Сообщение Re[3]: Специализация шаблонов по 2 параметрам от 18.02.2016 14:08

Изменено 18.02.2016 20:58 andyp

Здравствуйте, rg45, Вы писали:

R>На самом деле, не обязательно. В С++ существует и такая форма специализации для функций-членов шаблонных классов:

R>И это именно специализация функций-членов, без специализации самого шаблонного класса.

Про это я знал, но ТС определил конструкторы в теле класса, а затем вне тела для специализации. Поэтому я и подумал, что ему потребуется определить специализацию.

R>Такая форма специализации, конечно же, допустима и для конструкторов. Поэтому в исходном примере достаточно просто заменить специализацию конструкторов на перегрузку:


  Код
R>
R>template<class T>
R>class Test
R>{
R>public:
R>    template <class T2>
R>        Test(const T2* sz)
R>    {
R>        printf ("common version\n");
R>    }
R>    Test(const char* sz)
R>    {
R>        printf ("T.a. str: %s\n", sz);
R>    }
R>    Test(const wchar_t* sz)
R>    {
R>        printf ("T.w. str: %S\n", sz);
R>    }
R>protected:
R>};
R>// Поная специализация конструктора без специализации самого шаблонного класса:
R>template<>
R>Test<char>::Test(const wchar_t* sz)// компилируется
R>{
R>    printf ("a.w. str: %S\n", sz);
R>}
R>


Занятный пример. Это вроде компилируется, но на мой взгляд ломает ODR. Компиляторам вроде бы можно не отлавливать подобное. См. дискуссию здесь:
http://stackoverflow.com/questions/26305368/c-define-member-function-outside-template-class-but-in-header

Я бы так точно не делал.
Re[3]: Специализация шаблонов по 2 параметрам
Здравствуйте, rg45, Вы писали:

R>На самом деле, не обязательно. В С++ существует и такая форма специализации для функций-членов шаблонных классов:

R>И это именно специализация функций-членов, без специализации самого шаблонного класса.

Про это я знал, но ТС определил конструкторы в теле класса, а затем вне тела для специализации. Поэтому я и подумал, что ему потребуется определить специализацию.

R>Такая форма специализации, конечно же, допустима и для конструкторов. Поэтому в исходном примере достаточно просто заменить специализацию конструкторов на перегрузку:


  Код
R>
R>template<class T>
R>class Test
R>{
R>public:
R>    template <class T2>
R>        Test(const T2* sz)
R>    {
R>        printf ("common version\n");
R>    }
R>    Test(const char* sz)
R>    {
R>        printf ("T.a. str: %s\n", sz);
R>    }
R>    Test(const wchar_t* sz)
R>    {
R>        printf ("T.w. str: %S\n", sz);
R>    }
R>protected:
R>};
R>// Поная специализация конструктора без специализации самого шаблонного класса:
R>template<>
R>Test<char>::Test(const wchar_t* sz)// компилируется
R>{
R>    printf ("a.w. str: %S\n", sz);
R>}
R>


Занятный пример. Это вроде компилируется, но на мой взгляд ломает ODR. Компиляторам вроде бы можно не отлавливать подобное. См. дискуссию здесь:
http://stackoverflow.com/questions/26305368/c-define-member-function-outside-template-class-but-in-header

Я бы так точно не делал.


Вы правы, здесь все нормально, просто это специализации отдельных методов класса.