Форум программистов, компьютерный форум CyberForum.ru

Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> - C++

Восстановить пароль Регистрация
 
 
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
18.01.2014, 17:13     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #1
Добрый день. Помогите, пожалуйста, разобраться. У меня есть шаблонный класс
C++
1
2
template<class Tclass>
ClassA;
.
И есть тип указателя на объект этого класса:
C++
1
typedef ClassA<class Tclass>* ClassAPtr;
Есть указатель
C++
1
ClassA* a;
и есть
C++
1
ClassAPtr p;
И есть вот такая инструкция
C++
1
a = p;
На эту инструкцию компилятор говорит:
error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> *
В чём здесь ошибка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
18.01.2014, 17:17     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #2
Ты должен описать оператор '=' для твоего класса. Вот тебе пример.
C++
1
2
3
4
5
6
7
8
9
10
11
class Integer
{
private:
    int value;
public:
    Integer(int i): value(i) 
    {}
    const Integer operator+(const Integer& rv) const {
        return (value + rv.value);
    }
};
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
18.01.2014, 17:22     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #3
Цитата Сообщение от maria_ Посмотреть сообщение
C++
1
2
template<class Tclass> 
ClassA;
и что это?
Цитата Сообщение от maria_ Посмотреть сообщение
C++
1
typedef ClassA<class Tclass>* ClassAPtr;
что такое Tclass? и зачем там class(typename)?
Цитата Сообщение от maria_ Посмотреть сообщение
C++
1
ClassA* a;
classA - шаблонный класс, где параметр шаблона?

Цитата Сообщение от maria_ Посмотреть сообщение
В чём здесь ошибка?
в приведенных строчках - почти везде!
Приведите нормальный пример, воспроизводящий ошибку.
Цитата Сообщение от Bend3r Посмотреть сообщение
Ты должен описать оператор '=' для твоего класса.
какой operator=? Тут присваивание указателей
Jupiter
18.01.2014, 17:28
  #4

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
что такое Tclass? и зачем там class(typename)?
Цитата Сообщение от Croessmah Посмотреть сообщение
и что это?
forward declaration
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
 
typedef std::vector<class Foo> FooVec;
 
class Foo
{
    public: Foo() { std::cout << "Foo c-tor\n"; }
};
 
int main() 
{
    FooVec vec;
    vec.push_back(Foo());
    return 0;
}

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
18.01.2014, 17:29     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #5
Цитата Сообщение от Jupiter Посмотреть сообщение
forward declaration
C++
1
2
template<class Tclass>
ClassA;
а так?
C++
1
2
template<class Tclass>
class ClassA;
Если взять из примера ТС строчку
C++
1
typedef ClassA<class Tclass>* ClassAPtr;
и перевести к Вашему, то получится
C++
1
typedef std::vector<class T> FooVec;
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
18.01.2014, 17:30     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #6
Цитата Сообщение от maria_ Посмотреть сообщение
ClassA* a;
требует специализации, вы явно неверно изложили всю суть.

Попробуйте уменьшить код, оставив только минимум и выложить его на форум.
Jupiter
18.01.2014, 17:32
  #7

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
template<class Tclass>
ClassA;
проглядел, это конечно же ошибка, но на счет 2-го - forward declaration

Croessmah
18.01.2014, 17:32
  #8

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
но на счет 2-го - forward declaration
я уже написал
во всяком случае Tclass нигде не упоминается как тип, только как параметр шаблона

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
18.01.2014, 17:39     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #9
Оно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Tclass;
 
template<class Tclass>
class ClassA;
 
typedef ClassA<class Tclass>* ClassAPtr;
 
 
int main()
{
    ClassA<Tclass>* a;
    ClassAPtr p;
    a = p;
}
Добавлено через 1 минуту
Просто судя по ошибке, ТС как параметр шаблона Tclass использует.
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
18.01.2014, 17:40  [ТС]     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #10
Вот код, уменьшенный и воспроизводящий ошибку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <algorithm>
#include <vector>
 
class ClassB
{
    int b;
};
 
template<class Tclass> 
class ClassA;
 
typedef ClassA<class Tclass>* ClassAPtr;
 
template<class Tclass> 
class ClassA
{
    Tclass t;
public:
    void Func()
    {
        ClassA* a;
        ClassAPtr p;
        a = p;
    }
};
 
int main()
{
    ClassA<ClassB>* a;
    a->Func();
    return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
18.01.2014, 17:41     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #11
C++
1
ClassA* a;
не указан параметр шаблона
C++
1
typedef ClassA<class Tclass>* ClassAPtr;
Tclass - это не имя типа, возможно Вы имели ввиду classB
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
18.01.2014, 17:45     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #12
Цитата Сообщение от MrGluck Посмотреть сообщение
ТС как параметр шаблона Tclass использует.
я же говорил
Croessmah
18.01.2014, 17:46
  #13

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
я же говорил
и я говорил

maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
18.01.2014, 17:51  [ТС]     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #14
Прокомментировала чуть-чуть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <algorithm>
#include <vector>
 
class ClassB
{
    int b;
};
 
template<class Tclass> 
class ClassA;
 
 
typedef ClassA<class Tclass>* ClassAPtr; // Здесь хочется именно  Tclass, чтобы
// можно было для разных классов - параметров шаблона использовать
 
template<class Tclass> 
class ClassA
{
    Tclass t;
public:
    void Func()
    {
        ClassA<Tclass>* a; // Здесь имеется в виду Tclass - параметр шаблона
        ClassAPtr p;
        a = p;
    }
};
 
int main()
{
    ClassA<ClassB>* a;
    a->Func();
    return 0;
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
18.01.2014, 17:55     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #15
Вы понимаете, что ClassA на момент вызова Func уже имеет определенную специализацию?

Добавлено через 1 минуту
Т.е. что-то типа этого?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <algorithm>
#include <vector>
 
class ClassB
{
    int b;
};
 
template<class Tclass>
class ClassA
{
    Tclass t;
public:
    void Func()
    {
        typedef ClassA<Tclass>* ClassAPtr;
        ClassA<Tclass>* a;
        ClassAPtr p;
        a = p;
    }
};
 
int main()
{
    ClassA<ClassB>* a;
    a->Func();
    return 0;
}
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
18.01.2014, 18:07  [ТС]     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #16
Цитата Сообщение от MrGluck Посмотреть сообщение
Т.е. что-то типа этого?
Не могу писать
C++
1
typedef ClassA<class Tclass>* ClassAPtr;
внутри класса, т.к. на самом деле всё так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <algorithm>
#include <vector>
 
class ClassB
{
    int b;
};
 
template<class Tclass> 
class ClassA;
 
 
typedef ClassA<class Tclass>* ClassAPtr; // Здесь хочется именно  Tclass, чтобы
// можно было для разных классов - параметров шаблона использовать
 
template<class Tclass> 
class Factory
{
public:
    Factory() {}
    ClassAPtr GetPtr()
    {
        ClassAPtr<Tclass> result;
        return result;
    }
};
 
template<class Tclass> 
class ClassA
{
    Tclass t;
public:
    void Func()
    {
        ClassA<Tclass>* a; // Здесь имеется в виду Tclass - параметр шаблона
        Factory<Tclass>* f;
        a = f->GetPtr();
    }
};
 
int main()
{
    ClassA<ClassB>* a;
    a->Func();
    return 0;
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
18.01.2014, 18:34     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #17
Цитата Сообщение от maria_ Посмотреть сообщение
ClassAPtr<Tclass> result;
ClassAPtr это вообще не шаблон, это уже его специализация, т.е. конкретный класс
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
18.01.2014, 19:09  [ТС]     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #18
Цитата Сообщение от MrGluck Посмотреть сообщение
ClassAPtr это вообще не шаблон, это уже его специализация, т.е. конкретный класс
А можно как-нибудь, используя typedef, сделать ClassAPtr шаблонным?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
18.01.2014, 19:20     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #19
Вы не понимаете чего хотите.
Используйте ClassA<class Tclass>* и забудьте про ClassAPtr
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2014, 19:28     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass>
Еще ссылки по теме:

error: cannot convert to in assigment C++
C++ Error C2440: =: невозможно преобразовать 'std::string' в 'double'
Error C2440 std::vector<_Ty> C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.01.2014, 19:28     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass> #20
Цитата Сообщение от maria_ Посмотреть сообщение
А можно как-нибудь, используя typedef, сделать ClassAPtr шаблонным?
можно, но только в С++11 и не через typedef, а через using
Yandex
Объявления
18.01.2014, 19:28     Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass>
Ответ Создать тему
Опции темы

Текущее время: 08:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru