<Шаблон> В чём проблема?
От: Senyai Россия http://www.arseniy.net
Дата: 10.03.05 18:55
Оценка:
subj.
желательно со ссылками на стандарт (;
template<typename T>
struct A
  {
    static const int SZ;
    char r[SZ];
  };
int main()
  {
    A<int> i;
    A<char> c;
  }
const int A<int>::SZ=1;
Не бойтесь совершенства. Вам его не достичь. © Сальвадор Дали
Re: <Шаблон> В чём проблема?
От: sch  
Дата: 10.03.05 19:14
Оценка:
Здравствуйте, Senyai, Вы писали:

S>subj.

S>желательно со ссылками на стандарт (;
S>
S>template<typename T>
S>struct A
S>  {
S>    static const int SZ;
S>    char r[SZ];
S>  };
S>int main()
S>  {
S>    A<int> i;
S>    A<char> c;
S>  }
S>const int A<int>::SZ=1;
S>


Intel C++ пишет: main.cpp(11): error: constant value is not known.
Собственно, значение SZ не известно, поэтому компилятор и не может сгенерировать код. Решается следующим образом:
static const int SZ=100;
Re[2]: <Шаблон> В чём проблема?
От: octofox Россия  
Дата: 10.03.05 19:23
Оценка:
Здравствуйте, sch, Вы писали:

sch>Intel C++ пишет: main.cpp(11): error: constant value is not known.

sch>Собственно, значение SZ не известно, поэтому компилятор и не может сгенерировать код. Решается следующим образом:
sch>
sch>static const int SZ=100;
sch>


вообще-то было написано
S>>
S>>const int A<int>::SZ=1;
S>>

и имелось в виду, что в зависимости от T SZ может принимать разные значения
Re: <Шаблон> В чём проблема?
От: Костя Ещенко Россия  
Дата: 10.03.05 23:27
Оценка: 43 (6)
Здравствуйте, Senyai, Вы писали:

S>subj.

S>желательно со ссылками на стандарт (;
S>
S>template<typename T>
S>struct A
S>  {
S>    static const int SZ;
S>    char r[SZ];
S>  };
S>int main()
S>  {
S>    A<int> i;
S>    A<char> c;
S>  }
S>const int A<int>::SZ=1;
S>


Правильный синтаксис определения статических данных-членов шаблона такой
// общее определение
template<typename T>
const int A<T>::SZ=2;

// специализция для int
template<>
const int A<int>::SZ=1;


Размер массива должен являться integral constant expression. Статические данные-члены могут входить в integral constant expression внутри определения класса только если они инициализированы при объявлении (9.4.2/4).
template<typename T>
struct A
{
  static const int SZ = 25;
  char r[SZ];
};

Если хочется варьировать значение SZ в зависимости от типа, не специализируя struct A, можно использовать traits
template<typename T>
struct A_traits
{
  static const int SZ = 2;
};

template<>
struct A_traits<int>
{
  static const int SZ = 1;
};

template<typename T>
struct A
{
  static const int SZ = A_traits<T>::SZ;
  char r[SZ];
};
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[2]: <Шаблон> В чём проблема?
От: Senyai Россия http://www.arseniy.net
Дата: 11.03.05 07:51
Оценка: :)
Костя Ещенко, огромное спасибо за ответ. Откуда Вы это всё знаете, подскажите plz.
Не бойтесь совершенства. Вам его не достичь. © Сальвадор Дали
Re[3]: <Шаблон> В чём проблема?
От: Костя Ещенко Россия  
Дата: 11.03.05 12:57
Оценка:
Senyai wrote:

> Костя Ещенко, огромное спасибо за ответ. Откуда Вы это всё знаете, подскажите plz.


Нахватался помаленьку Теперь и Вы это все знаете
Posted via RSDN NNTP Server 1.9
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.