Typedefs и специализация шаблона - PullRequest
2 голосов
/ 05 августа 2010

Рассмотрим этот код:

typedef int type1;
typedef int type2;

template <typename>
struct some_trait;

template <>
struct some_trait<type1>
{
    static const int something=1;
};

template <>
struct some_trait<type2>
{
    static const int something=2;
};

Сбой, потому что компилятор видит две специализации some_trait<int>.

Как лучше всего обойти это?

Ответы [ 7 ]

7 голосов
/ 05 августа 2010

Я думаю, что для того, чтобы специализироваться на именах type1 и type2, вам придется сделать их фактически разными типами вместо псевдонима для одного типа:

struct type1 {
     int data;
};

struct type2 {
    int data;
};

// ...

Но если вы объясните больше о своей конечной цели, может быть другой / лучший способ выполнить то, что вы ищете.

3 голосов
/ 05 августа 2010

Этот код не выполняется, потому что компилятор видит ту же самую специализацию дважды .

Ваша проблема в том, что typedef, несмотря на свое имя, не определяет новый тип.Он генерирует только псевдоним для другого типа.type1 и type2 и int на самом деле просто разные имена для одного и того же типа.

Что лучше всего сделать, зависит от того, чего вы хотите достичь.Если вам абсолютно необходима эта специализация, вам придется придумать два разных типа.Тем не менее, могут быть лучшие способы сделать это.

3 голосов
/ 05 августа 2010

у вас может быть что-то подобное, если вы имеете в виду явная специализация :

enum TypeOne;
enum TypeTwo;

template <typename>
class AClass;

template <>
class AClass<TypeOne>{
 public:
  int something;
};

template <>
class AClass<TypeTwo>{
 public:
  char something;
};

AClass<TypeOne> obj1;
AClass<TypeTwo> obj2;

Я также видел кое-что из буст-библиотек , которые могут делать то, что вы хотите, typedef одного и того же типа для разных типов для явной специализации, но я не помню, что именно было.

3 голосов
/ 05 августа 2010

Лучший способ, что именно?

Оба typenames относятся к одному и тому же типу int.Поскольку здесь есть только один тип, вам нужна только одна черта.Таким образом, «лучший способ обойти это» состоит в том, чтобы убрать вторую специализацию и забыть об этом.Готово.

Это то, что вы хотели?Если нет, предоставьте более содержательное описание того, чего вы пытаетесь достичь.

2 голосов
/ 05 августа 2010

Звучит так, будто вы ищете следующее:

template <int arg>
class AClass
{
    static const int something=arg;
};

который будет создан как:

AClass<1> obj1;
AClass<2> obj2;
0 голосов
/ 06 сентября 2010

Я думаю, что вы хотите достичь чего-то вроде этого: template <typename T, T t> struct typify{ static const T something = t;}; Тогда ваши две специализации будут записаны как struct int_1 : typify<int, 1>{}; и ...

0 голосов
/ 05 августа 2010

Я не вижу, что вы пытаетесь сделать здесь.В конце концов, оба some_trait< int > .
Пробовали создавать структуры вокруг одного целого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...