шаблон частичной специализации инициализации статических полей - PullRequest
4 голосов
/ 05 января 2011

Я пытаюсь что-то вроде следующего:

struct MyType { };

template <typename T>
struct Test
{
    static const MyType * const sm_object;
};

template <>
struct Test<void>
{
    static const MyType * const sm_object;
};

template <typename T> const MyType * const Test<T>::sm_object = new MyType();
template <> const MyType * const Test<void>::sm_object = new MyType();

Я включаю это в 2 файла - a.cpp и b.cpp.Я пытаюсь скомпилировать и получить:

error C2998: 'const MyType *Test<void>::sm_object' : cannot be a template definition

Я предполагаю, что мой синтаксис C ++ плох, но я не могу думать, что я делаю неправильно.

Я не могу удалить template<> из определения переменной, так как мне нужно это в нескольких единицах перевода, и это приведет к ошибке ссылки.

Я мог бы поместить поле в базовый класс и использовать CRTP для создания нового экземпляра втипа, и тогда специализация не помешает, но почему не работает эта «прямая» инициализация поля?Должно быть, мне не хватает некоторого фрагмента синтаксиса.

Я использую VS2003: (

Ответы [ 3 ]

6 голосов
/ 05 января 2011

Судя по g ++, я думаю, вам нужно удалить template<> из этой строки и поместить остаток только в один исходный файл (не в заголовке). Поскольку это специализация, она похожа на обычную не шаблонную статику, которую вы не определяете в заголовке.

В некоторых .C файлах:

const MyType * const Test<void>::sm_object = new MyType();

2 голосов
/ 23 марта 2011

Я считаю, что вы хотите сделать что-то вроде этого

struct MyType { };

template <typename T>
struct Test
{
    static const MyType * const sm_object;
    static const MyType* set_object()
    {
        return nullptr;
    }
};

template <>
struct Test<void>
{
    static const MyType * const sm_object;
    static const MyType* set_object()
    {
        return new MyType();
    }
};

template <typename T> 
const MyType * Test<T>::sm_object = Test< T >::set_object();
0 голосов
/ 10 февраля 2011

Я полагаю, что следующий код может быть весьма интересен для некоторых людей:

#include <stdio.h>
template<class X,int Y>
struct B
{
  X content;
  static const int nr=Y;
};

int main(int, char**)
{
  B<char,1> a;
  B<int,2> b;
  B<int,3> c;
  printf("%d, %d, %d\n",a.nr,b.nr,c.nr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...