static + частичная специализация шаблона?
От: Аноним  
Дата: 22.08.09 16:55
Оценка:
Хай!

На MSVC2005 не компилится код:

template<const long PropertyID, class Type, class BaseType, class OwnerType>
class TProperty : public TBaseProperty
{
   //...
private:
   static defString name;
   //...
};

template<const long PropertyID, class Type, class BaseType, class OwnerType>
defString TProperty<PropertyID, Type, BaseType, OwnerType>::name=_T(""); //OK!

template<class Type, class BaseType, class OwnerType>
defString TProperty<1, Type, BaseType, OwnerType>::name=_T("1"); //не компилится частичная специализация шаблона

template<class Type, class BaseType, class OwnerType>
defString TProperty<2, Type, BaseType, OwnerType>::name=_T("2"); //не компилится частичная специализация шаблона

Ошибки:
error C3860: template argument list following class template name must list parameters in the order used in template parameter list
error C2086: 'std::string TProperty<PropertyID,Type,BaseType,OwnerType>::name' : redefinition

Как правильно чтобы компилялось?
Re: static + частичная специализация шаблона?
От: Кодт Россия  
Дата: 22.08.09 17:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как правильно чтобы компилялось?


Не подскажу, как грамотно частично специализировать, а вот как обойти — это запросто.
Раз у тебя имя зависит только от индекса — вынеси в отдельный шаблон.
template<int N> struct Name { static const char* const name; };

template<int N> const char* const Name::name = "";
template<> const char* const Name<1>::name = "1";
template<> const char* const Name<2>::name = "2";

template<int N, class X, class Y, class Z>
string const TProperty<N,X,Y,Z>::name = Name<N>::name;
Перекуём баги на фичи!
Re[2]: static + частичная специализация шаблона?
От: Аноним  
Дата: 22.08.09 18:34
Оценка:
Здравствуйте, Кодт, Вы писали:

Сработало только теперь студия с ума сходит:
error C2471: cannot update program database '..\debug\vc80.pdb'
Re: static + частичная специализация шаблона?
От: Юрий Жмеренецкий ICQ 380412032
Дата: 22.08.09 18:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Хай!


А>На MSVC2005 не компилится код:


// primary template
А>template<const long PropertyID, class Type, class BaseType, class OwnerType>
А>class TProperty : public TBaseProperty
А>{
А>   //...
А>private:
А>   static defString name;
А>   //...
А>};

// Определение члена primary template
А>template<const long PropertyID, class Type, class BaseType, class OwnerType>
А>defString TProperty<PropertyID, Type, BaseType, OwnerType>::name=_T(""); //OK!

// partial specialization
template<class Type, class BaseType, class OwnerType>
class TProperty<1, Type, BaseType, OwnerType>
{
  //...
private:
   static defString name;
};

// Определение члена соответствующей специализации 
// К primary template не имеет отношения. Для наглядности можно имена поменять.
А>template<class Type, class BaseType, class OwnerType>
А>defString TProperty<1, Type, BaseType, OwnerType>::name=_T("1");


А>Как правильно чтобы компилялось?
Re[2]: static + частичная специализация шаблона?
От: Аноним  
Дата: 22.08.09 18:45
Оценка: 1 (1)
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Здравствуйте, Аноним, Вы писали:


Огo Это будет много копипаста-писанины
Решение Кодта более компактное выходит
Re[3]: static + частичная специализация шаблона?
От: Аноним  
Дата: 22.08.09 20:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Кодт, Вы писали:


А>Сработало только теперь студия с ума сходит:

А>
А>error C2471: cannot update program database '..\debug\vc80.pdb'
А>

А если отключить Minimal Rebuild то получаем:
fatal error C1001: An internal error has occurred in the compiler.(compiler file 'msc1.cpp', line 1393)

Удалить директорию Debug и пересобрать не помогает, хотя раньше помогало
Есть для MSVC2005 патч на эти ошибки? Нашел только для MSVC2008
P.S. MSVC2005 SP1 установлен.
Re[4]: static + частичная специализация шаблона?
От: Аноним  
Дата: 22.08.09 22:14
Оценка:
Здравствуйте, Аноним, Вы писали:

Метод понравился но он нещадно валит компилятор MSVC2005, откатил все изменения назад компилятор снова заработал.
Re[5]: static + частичная специализация шаблона?
От: Кодт Россия  
Дата: 22.08.09 23:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Метод понравился но он нещадно валит компилятор MSVC2005, откатил все изменения назад компилятор снова заработал.


Странно... у меня не валит.
Только маленькая работа над ошибками:
template<int N> const char* const Name<N>::name = "";


Собственно, дистиллированный пример
#include <string>
#include <iostream>
using namespace std;

template<int N> struct Name { static const char* const name; };

template<int N> const char* const Name<N>::name = "";
template<> const char* const Name<1>::name = "1";
template<> const char* const Name<2>::name = "2";


template<int N, class X, class Y, class Z>
struct TProperty { static string const name; };

template<int N, class X, class Y, class Z>
string const TProperty<N,X,Y,Z>::name = Name<N>::name;

int main()
{
cout << "=" << TProperty<0,int,int,int>::name << endl;
cout << "=" << TProperty<1,int,int,int>::name << endl;
cout << "=" << TProperty<2,int,int,int>::name << endl;
cout << "=" << TProperty<3,int,int,int>::name << endl;
}


Попробуй как-то тоже зарезать свой код, добиться, чтобы компилятор или перестал падать, или продолжил падения на откровенно правильных вещах. Тогда станет ясно, у тебя баг или у компилятора (хотя ICE — это всегда баг...)
Перекуём баги на фичи!
Re[6]: static + частичная специализация шаблона?
От: Аноним  
Дата: 23.08.09 10:22
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Попробуй как-то тоже зарезать свой код, добиться, чтобы компилятор или перестал падать, или продолжил падения на откровенно правильных вещах. Тогда станет ясно, у тебя баг или у компилятора (хотя ICE — это всегда баг...)


Начал постепенно добавлять новый код, оказалось что валит компилятор простое обьявление члена класса шаблона как static просто сорс кода 25Mb и бывало не первый раз когда компилятор подыхает на некоторых вещах, но раньше можна было переписать валящую компилер вещь по другому и компилятор попускало, а здесь static по другому не запишешь
Re[7]: static + частичная специализация шаблона?
От: Кодт Россия  
Дата: 23.08.09 11:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Начал постепенно добавлять новый код, оказалось что валит компилятор простое обьявление члена класса шаблона как static просто сорс кода 25Mb и бывало не первый раз когда компилятор подыхает на некоторых вещах, но раньше можна было переписать валящую компилер вещь по другому и компилятор попускало, а здесь static по другому не запишешь


А если всё повыкидывать и только это объявление оставить?
Можешь сделать дистиллированный пример?
Возможно, там какая-нибудь ерунда простейшая, из-за которой ill-formed программа валит компилятор.
Перекуём баги на фичи!
Re[8]: static + частичная специализация шаблона?
От: Аноним  
Дата: 23.08.09 12:11
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А если всё повыкидывать и только это объявление оставить?

К>Можешь сделать дистиллированный пример?
К>Возможно, там какая-нибудь ерунда простейшая, из-за которой ill-formed программа валит компилятор.

Оно вообще падает в другом месте при компиляции класса сгенерированного визардом студии, который до этого компилировался без проблем. Надо переписать тот же код как то по другому чтобы компилировалось по другому сценарию и должно попустить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.