вызов шаблонной ф-ии
От: enots  
Дата: 10.03.06 09:14
Оценка:
  template <class T >
   class MyClass {
     private:
       T value;
     public:
        MyClass(T value_ = T()):value(value_){cout<<"from Constructor value = "<<value<<endl;}
        
       template <class X>
       void assign(const MyClass<X>& x) { // x must have same type as *this
           value = x.value;
       }

        T getValue()const
        {
            return value;
        }
   };

int main( int argc, char ** argv )
{
    MyClass<int> T1, T3;
    MyClass<double> T2;


    T1.assign(T3); //нет ошибки 
    T1.assign(T2); //error C2248: 'MyClass<T>::value' : cannot access private member declared in class 'MyClass<T>'

  return 0;
}


кто нибудь может пояснить почему во втором случае ошибка?
Re: вызов шаблонной ф-ии
От: Аноним  
Дата: 10.03.06 09:17
Оценка:
Здравствуйте, enots, Вы писали:

E>
E>  template <class T >
E>   class MyClass {
E>     private:
E>       T value;
E>     public:
E>        MyClass(T value_ = T()):value(value_){cout<<"from Constructor value = "<<value<<endl;}
        
E>       template <class X>
E>       void assign(const MyClass<X>& x) { // x must have same type as *this
E>           value = x.value;
E>       }

E>        T getValue()const
E>        {
E>            return value;
E>        }
E>   };

E>int main( int argc, char ** argv )
E>{
E>    MyClass<int> T1, T3;
E>    MyClass<double> T2;

добавь в класс
template <class T>
friend class MyClass;


E>    T1.assign(T3); //нет ошибки 
E>    T1.assign(T2); //error C2248: 'MyClass<T>::value' : cannot access private member declared in class 'MyClass<T>'

E>  return 0;
E>}

E>


E>кто нибудь может пояснить почему во втором случае ошибка?
Re: вызов шаблонной ф-ии
От: ekamaloff Великобритания  
Дата: 10.03.06 09:19
Оценка:
Здравствуйте, enots, Вы писали:

E>кто нибудь может пояснить почему во втором случае ошибка?


Видимо потому-что две специализации шаблона: MyClass<int> и MyClass<double> — по сути разные классы и следовательно не имеют доступ к приватным переменным друг друга
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: вызов шаблонной ф-ии
От: enots  
Дата: 10.03.06 09:21
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, enots, Вы писали:


E>>кто нибудь может пояснить почему во втором случае ошибка?


E>Видимо потому-что две специализации шаблона: MyClass<int> и MyClass<double> — по сути разные классы и следовательно не имеют доступ к приватным переменным друг друга


А если одного типа то имеет? не мог бы найти место в стандарте?
Re: вызов шаблонной ф-ии
От: rg45 СССР  
Дата: 10.03.06 09:29
Оценка:
"enots" <19635@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1773317@news.rsdn.ru...
E>...
E> кто нибудь может пояснить почему во втором случае ошибка?

Дело в том, что разные классы, порожденные от одного шаблона не имеют доступа к закрытым членам друг друга.
Для того, чтобы сделать их друзьями друг друга, добавь в объявлении своего класса такую строчку:
...
template <typename>  friend class MyClass;
...
};
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: вызов шаблонной ф-ии
От: ekamaloff Великобритания  
Дата: 10.03.06 09:36
Оценка: 1 (1)
Здравствуйте, enots, Вы писали:

E>>Видимо потому-что две специализации шаблона: MyClass<int> и MyClass<double> — по сути разные классы и следовательно не имеют доступ к приватным переменным друг друга


E>А если одного типа то имеет? не мог бы найти место в стандарте?


Ну представь, что в результате специализации шаблона, у тебя получилось следующее:

class MyClass_int
{
  int value;
public:
  void assign(const MyClass_int& i)
  {
    value = i.value;
  }
  void assign(const MyClass_double& d)
  {
    value = d.value;
  }
};

class MyClass_double
{
  double value;
public:
  void assign(const MyClass_int& i)
  {
    value = i.value;
  }
  void assign(const MyClass_double& d)
  {
    value = d.value;
  }
};

int main()
{
  MyClass_int i1, i2;
  MyClass_double d;
  
  i1.assign(i2); // нет ошибки
  i1.assign(d); // есть ошибка
  
  return 0;
}


Удивит ли тебя ошибка в этом случае? Станешь ли ты искать место в стандарте?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: вызов шаблонной ф-ии
От: saddva  
Дата: 10.03.06 23:06
Оценка:
Здравствуйте, enots, Вы писали:

E>
E>  template <class T >
E>   class MyClass {
E>     private:
E>       T value;
E>     public:
E>        MyClass(T value_ = T()):value(value_){cout<<"from Constructor value = "<<value<<endl;}
        
E>       template <class X>
E>       void assign(const MyClass<X>& x) { // x must have same type as *this
E>           value = x.value;
E>       }

E>        T getValue()const
E>        {
E>            return value;
E>        }
E>   };

E>int main( int argc, char ** argv )
E>{
E>    MyClass<int> T1, T3;
E>    MyClass<double> T2;


E>    T1.assign(T3); //нет ошибки 
E>    T1.assign(T2); //error C2248: 'MyClass<T>::value' : cannot access private member declared in class 'MyClass<T>'

E>  return 0;
E>}

E>


E>кто нибудь может пояснить почему во втором случае ошибка?


Если интересно, почему так, то просто из MyClass с параметром int и из MyClass с параметром double построенны, естественно 2 отдельных класса. И из метода одного нет доступа к данным другого.
Поэтому или вызывай x.getValue() в assign, или сделай для MyClass друзьями все остальные возможные классы MyClass<T>.
Re[3]: вызов шаблонной ф-ии
От: Андрей Тарасевич Беларусь  
Дата: 11.03.06 00:55
Оценка:
Здравствуйте, enots, Вы писали:

E>>>кто нибудь может пояснить почему во втором случае ошибка?


E>>Видимо потому-что две специализации шаблона: MyClass<int> и MyClass<double> — по сути разные классы и следовательно не имеют доступ к приватным переменным друг друга


E>А если одного типа то имеет?


Да, имеет. Разделение доступа в С++ делается с точностью до конкретного класса. Все экземпляры одного и того же класса имеют доступ к 'private' членам друг друга. Экземпляры разных классов такого доступа не имеют.

E>не мог бы найти место в стандарте?


А что именно интересует? Спецификация разделения доступа по 'private'? Раздел 11/1 и далее.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.