по какой причине я выхожу на 111? - PullRequest
1 голос
/ 13 мая 2010

включает "stdafx.h"

#include<iostream.h>

template<class T>
class Sample
{
    public:
        Sample();
        static int i;



};
template<class T>
int Sample<T>::i = 0;
template<class T>
Sample<T>::Sample()
{
    i++;
    cout<<i;
}

void main()
{
    Sample<int>s1;
    Sample<float>s2;
    Sample<char>s3;
}

выход: 111

по какой причине я выхожу на 111?

Ответы [ 6 ]

7 голосов
/ 13 мая 2010

Причина, по которой на выходе выводится 111 (в отличие от 123), заключается в том, что Sample<int>, Sample<float> и Sample<char> - это три совершенно разных типа, и, следовательно, каждый из них имеет свою собственную, отдельную статическую переменную называется i.

У вас есть шаблон с именем Sample, и каждый раз, когда вы создаете его экземпляр с другим аргументом шаблона, он использует этот шаблон для создания нового класса на лету на основе шаблона. Но классы, созданные с использованием шаблона, не имеют отношения друг к другу и не передают статическую информацию.

2 голосов
/ 13 мая 2010

Попробуйте добавить строку

Sample<float> s2_2;

до main() (что должно вернуть int, между прочим). Это должно помочь проиллюстрировать то, что другие уже ответили.

Кроме того, вы можете включить информацию о типе в ваш вывод:

#include <typeinfo>
:
:
template<class T>
Sample<T>::Sample()
{
    i++;
    std::cout << typeid(T).name() << ':' << i << std::endl;
}
1 голос
/ 13 мая 2010

Sample - это шаблон класса, который используется для создания трех отдельных классов, каждый со своим собственным i.

1 голос
/ 13 мая 2010

Sample<int>::i, Sample<float>::i и Sample<char>::i - это три разные переменные. Следовательно, вы получаете 111.

0 голосов
/ 13 мая 2010

Sample<int>, Sample<float>, Sample<char> - это три разных типа, каждый из которых имеет свою статическую переменную.

Если бы вы хотели получить 123, вам пришлось бы поместить static int i в общий базовый класс.

0 голосов
/ 13 мая 2010

Если у вас есть шаблонный класс со статической переменной-членом, предполагается, что компилятор должен гарантировать, что для «каждого» типа T есть одна и только одна копия статической переменной. Поскольку вы создали экземпляр класса Sample с тремя различными типами, вы увидите вывод «1» для каждого типа.

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