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>кто нибудь может пояснить почему во втором случае ошибка?
Здравствуйте, 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
Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, enots, Вы писали:
E>>кто нибудь может пояснить почему во втором случае ошибка?
E>Видимо потому-что две специализации шаблона: MyClass<int> и MyClass<double> — по сути разные классы и следовательно не имеют доступ к приватным переменным друг друга
А если одного типа то имеет? не мог бы найти место в стандарте?
"enots" <19635@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1773317@news.rsdn.ru... E>... E> кто нибудь может пояснить почему во втором случае ошибка?
Дело в том, что разные классы, порожденные от одного шаблона не имеют доступа к закрытым членам друг друга.
Для того, чтобы сделать их друзьями друг друга, добавь в объявлении своего класса такую строчку:
...
template <typename> friend class MyClass;
...
};
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, 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
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>.
Здравствуйте, enots, Вы писали:
E>>>кто нибудь может пояснить почему во втором случае ошибка?
E>>Видимо потому-что две специализации шаблона: MyClass<int> и MyClass<double> — по сути разные классы и следовательно не имеют доступ к приватным переменным друг друга
E>А если одного типа то имеет?
Да, имеет. Разделение доступа в С++ делается с точностью до конкретного класса. Все экземпляры одного и того же класса имеют доступ к 'private' членам друг друга. Экземпляры разных классов такого доступа не имеют.
E>не мог бы найти место в стандарте?
А что именно интересует? Спецификация разделения доступа по 'private'? Раздел 11/1 и далее.