LINUX.ORG.RU

c++ Нубский вопрос

 ,


0

2

Предположим есть у нас код:

template <typename T>
struct A
{
    T data;
};

int main ()
{
    A<int> intData;
    A<char> charData;

return 0;
}

На основании этого кода компилятор нам создает два класса c соответствующими членами (int и char) вместо Т. А что происходит с таким кодом:

template <int N>
struct A
{
    A() : data(N) {};
    int data;
};

int main ()
{
    A<1> intData1; // intData1.data = 1;
    A<5> intData5; // intData5.data = 5;

return 0;
}


Компилятор здесь тоже будет создавать два типа с static const int = 1 и static const int = 5 соответственно или здесь что то другое происходит? И почему мы не можем для второго примера написать:

static const int = N
вместо конструктора ?


вместо тысячи слов:

#!/bin/bash

gcc -x c++ - -S -o- <<EOF
template <int N>
struct A
{
    A() : data(N) {};
    int data;
};

int main ()
{
    A<1> intData1; // intData1.data = 1;
    A<5> intData5; // intData5.data = 5;

return 0;
}
EOF

anonymous
()

Второй вариант в качеcтве параметра принимает не тип, а числовое значение, то есть конструкция из второго примера читается так:

A<1> intData1; // Создать обьект типа A, проинициализировав A::data значением 1

Ни о каких «static const int» нигде ничего не сказанно. data будет создаваться на той же памяти где и A, тобишь в твоём случае на стеке. Просто будет инциализированна таким вот странным способом.

Вообщем учись формулировать вопросы, ибо нифига не понятно, чего тебе не понятно, и откуда ты берёшь «static const int» :)

В частности не ясно, где ты хочешь написать

static const int = N

и чего ты хочешь этим добиться

pon4ik ★★★★★
()
Последнее исправление: pon4ik (всего исправлений: 2)
Ответ на: комментарий от CunMun

Ой сори точно работает.. с = вместо скобок. Спасибо всем кто ответил. Как удалить этот тред ?

Давай может вообще все решенные треды поудаляем?

slyjoeh ★★★
()
Ответ на: комментарий от CunMun

Ой сори точно работает.. с = вместо скобок.

На будущее. static const int data(N); - это прототип статического метода data, а не объявление константы. В подобных неоднозначных случаях используй либо инициализацию через =, либо через фигурные скобки {} из С++ 11.

archie
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.