Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
-829 / 16 / 0
Регистрация: 22.09.2015
Сообщений: 901
1

Ошибка: specialization of '.' after instantiation

23.11.2021, 22:29. Показов 3386. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть свой класс через шаблон для разных типов: template <typename dTYPE> class Array {}
Если в main создаю объект класса Array<LETTER> str; то всё нормально.
Если в свойстве другого класса указываю,
C++
1
2
3
4
5
6
class Text {
private:
    Array<LETTER> str;// << ошибка
public:
...
}
то ошибка:
Код
error: specialization of 'Array<dTYPE>::Array() [with dTYPE = char]' after instantiation
 Array<LETTER>::Array(){this->type="LETTER";}
                      ^
В чём дело?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2021, 22:29
Ответы с готовыми решениями:

Ошибка при комилировании. Cannot use template 'texnika<T>' without specifying specialization parameters
Выходит вот такая ошибка: Unit1.cpp(34): E2102 Cannot use template 'texnika&lt;T&gt;' without...

Почему выскакивает ошибка In instantiation of 'void stack_t<T>::println() const [with T = int]': - строка 165?
Ошибка: Почему она пропадает, если поставить const после print у stack_t&lt;T&gt;? #include...

error: explicit specialization in non-namespace scope - специализация шаблонов
Изучаю шаблоны и не могу нормально скомпилировать код. Версия компилятора - g++ (Debian 10.2.1-6)...

Ошибка "Error displaying the error page: Application Instantiation Error"
Доброго времени суток. Подскажите пожалуйста кто сталкивался с данной проблемой. У меня завис...

CBuilder XE Cannot use template 'multiset<_Kty,_Pr,_Alloc>' without specifying specialization parameters F
Unit1.cpp(32): E2102 Cannot use template 'multiset&lt;_Kty,_Pr,_Alloc&gt;' without specifying...

7
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
23.11.2021, 22:35 2
Значит, что шаблон уже был инстанцирован для типа char. Специализировать шаблон нельзя после инстанцирования. Ищи место в коде, где была точка инстанцирования.
0
-829 / 16 / 0
Регистрация: 22.09.2015
Сообщений: 901
23.11.2021, 22:43  [ТС] 3
Цитата Сообщение от jugu Посмотреть сообщение
где была точка инстанцирования
Есть описание класса в заголовке .h, есть описание методов в .cpp
это вот тоже поддчёркивает
C++
1
2
template <>
Array<LETTER>::Array(){this->type="LETTER";}
Не пойму в чём проблема
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,078
23.11.2021, 23:27 4
Цитата Сообщение от pgb Посмотреть сообщение
Есть описание класса в заголовке .h, есть описание методов в .cpp
Почему описание методов оказалось в .cpp? Зачем было сделано разделение на .h и .cpp?

Цитата Сообщение от pgb Посмотреть сообщение
это вот тоже поддчёркивает
C++
1
2
template <>
Array<LETTER>::Array(){this->type="LETTER";}
Так а что это такое? Для чего выполнена эта специализация? Зачем?
0
-829 / 16 / 0
Регистрация: 22.09.2015
Сообщений: 901
24.11.2021, 09:37  [ТС] 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Почему описание методов оказалось в .cpp? Зачем было сделано разделение на .h и .cpp?
Для подключения и упрощения компиляции, а также работы IDE(вывода свойств объектов и тд.) так делается.

Вот файл Variables.h
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
 
using namespace std;
 
//Variables
using POINTER=void*;        // указатель
using LOGIC=bool;           // 0..1
using RANGE=int8_t;     // -128..127
using LETTER=char;      // буква
using BYTE=uint8_t;         // 0..255
using INT_S=int16_t;        // -32768..32767
using INT_W=uint16_t;   // 0..65535
using INT_M=int32_t;        // -2147483648..2147483647
using INT_L=uint32_t;       // 0..4294967295
using INT_T=int64_t;        // -9223372036854775808..9223372036854775807
using INT_B=uint64_t;       // 0..18446744073709551615
using FLOAT=float;          // 1.8E-38..1.8E+38
using DOUBLE=double;    // 2.2E-308..1.8E+308
 
struct Bits {
    unsigned b0:1;
    unsigned b1:1;
    unsigned b2:1;
    unsigned b3:1;
    unsigned b4:1;
    unsigned b5:1;
    unsigned b6:1;
    unsigned b7:1;
};
struct Bytes {
    BYTE b0;
    BYTE b1;
    BYTE b2;
    BYTE b3;
    BYTE b4;
    BYTE b5;
    BYTE b6;
    BYTE b7;
};
 
union Code {
    BYTE byte;
    Bits bit;
};
union Block {
    uint64_t data;
    Bytes byte;
};
 
template <typename dTYPE>
class Array {
private:
    dTYPE *vars;
    STRING type;
    INT_L it=0,sz=0,tl=0,rv=0;
    void Vindex(INT_L &index);
public:
    Array();
    ~Array();
    INT_L Size();
    INT_L Total();
    LOGIC Prev();
    LOGIC Next();
    INT_L Index();
    void Index(INT_L ct);
    dTYPE Get(INT_L index=0);
    void Put(dTYPE val,INT_L index=0);
    void Set(dTYPE val,INT_L index=0);
    void Init(INT_L size=1,INT_L reserve=0);
    void Print(){// здесь реализация временная пока тестирую
        cout << this->type << "(" << this->sz << "," << this->tl << ")" << endl;
        for (INT_L nx=0;nx<this->sz;nx++)
            cout << nx+1 <<  " = " << this->vars[nx] << endl;
    }
};
 
class Text {
private:
    // Если раскомментировать, то будет ошибка
    //Array<LETTER> str; // РАЗКОММЕНТИРОВАТЬ
public:
    Text(const LETTER str[],INT_L rv=0){// здесь реализация временная пока тестирую
        INT_L sz=0;
        while(str[sz]!='\0')sz++;
        //cout << this->str.Type() << endl;
        //this->str.Init(sz,rv);
        //this->str.Print();
    }
    //~Object() ;
};
Вот файл Variables.cpp
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "Variables.h"
 
template <>
Array<LOGIC>::Array(){this->type="LOGIC";}
template <>
Array<RANGE>::Array(){this->type="RANGE";}
template <> // тут тоже ошибка возникает
Array<LETTER>::Array(){this->type="LETTER";}
template <>
Array<BYTE>::Array(){this->type="BYTE";}
template <>
Array<INT_S>::Array(){this->type="INT_S";}
template <>
Array<INT_W>::Array(){this->type="INT_W";}
template <>
Array<INT_M>::Array(){this->type="INT_M";}
template <>
Array<INT_L>::Array(){this->type="INT_L";}
template <>
Array<INT_T>::Array(){this->type="INT_T";}
template <>
Array<INT_B>::Array(){this->type="INT_B";}
template <>
Array<FLOAT>::Array(){this->type="FLOAT";}
template <>
Array<DOUBLE>::Array(){this->type="DOUBLE";}
 
template <typename dTYPE>
Array<dTYPE>::~Array(){
    delete []this->vars;
}
template <typename dTYPE>
void Array<dTYPE>::Vindex(INT_L &index){
    if(index>this->sz){index=~index+1;
        if(index<this->sz)index=this->sz-index;
            else index=this->sz-1;
    }else if(index>0)index--;
}
template <typename dTYPE>
INT_L Array<dTYPE>::Size(){return this->sz;}
template <typename dTYPE>
INT_L Array<dTYPE>::Total(){return this->tl;}
template <typename dTYPE>
LOGIC Array<dTYPE>::Prev(){
    if(this->it>0){
        this->it--;return true;
    }else return false;
}
template <typename dTYPE>
LOGIC Array<dTYPE>::Next(){
    if(this->it<this->sz-1){
        this->it++;return true;
    }else return false;
}
template <typename dTYPE>
INT_L Array<dTYPE>::Index(){return this->it+1;}
template <typename dTYPE>
void Array<dTYPE>::Index(INT_L it){
    this->Vindex(it);this->it=it;
}
template <typename dTYPE>
dTYPE Array<dTYPE>::Get(INT_L index){
    if(index==0)index=this->it;
    else this->Vindex(index);
    return this->vars[index];
}
 
template <typename dTYPE>
void Array<dTYPE>::Put(dTYPE val,INT_L index){
    this->Vindex(index);this->sz++;
    if(this->sz>this->tl){
        this->tl+=this->rv+1;
        dTYPE *vars=new dTYPE[this->tl] ;
        INT_L nx=0;
        while(nx<index){
            vars[nx]=this->vars[nx];nx++;
        }
        while(nx<this->sz){
            vars[nx+1]=this->vars[nx];nx++;
        }
        delete []this->vars;
        this->vars=vars;
    }else if(index<this->sz){
        for(INT_L nx=this->sz;nx>index;nx--)
            this->vars[nx]=this->vars[nx-1];
    }
    //cout << "Put[" << index+1 << "]=" << val << endl;
    this->vars[index]=val;
    //this->Print();
}
template <typename dTYPE>
void Array<dTYPE>::Set(dTYPE val,INT_L index){
    if(index==0)index=this->it;
    this->vars[index]=val;
}
template <typename dTYPE>
void Array<dTYPE>::Init(INT_L size,INT_L reserve){
    this->sz=size;this->rv=reserve;this->tl=size+reserve;
    this->vars=new dTYPE[this->tl];
}
 
int main(){
    setlocale(LC_ALL,"");
    Array<INT_L> obj;
    obj.Init(2,3);
    INT_L nx=1;
    do{
        obj.Set(nx);nx++;
    }while(obj.Next());
    obj.Put(nx,2);obj.Put(33,2);obj.Put(44,0);obj.Put(99,-1);
    obj.Put(888,2);obj.Put(5555,5);obj.Put(5555,7);obj.Put(5555,3);
    obj.Print();
    cout << "----------------" << endl;
    if(obj.Size()){
        obj.Index(-1);
        do{
            cout << obj.Get() << endl;
        }while(obj.Prev());
    }
    cout << "----------------" << endl;
    Array<LETTER> str;
    str.Init(2,3);
    str.Set('Ф');
    str.Print();
    
    // Для создания объекта типа Text
    // Text txt("проверка12"); // РАЗКОММЕНТИРОВАТЬ
    
    system("pause");
    return 0;
}
Если разкомментировать строки где есть ещё такой коммент // РАЗКОММЕНТИРОВАТЬ,
то возникает ошибка. Не понимаю в чём дело и как исправить.

Через этот конструктор я указываю тип массива, чтобы в любое время можно было узнать\проверить.
C++
1
2
template <> // тут тоже ошибка возникает
Array<LETTER>::Array(){this->type="LETTER";}
0
18901 / 9859 / 2410
Регистрация: 30.01.2014
Сообщений: 17,302
24.11.2021, 10:02 6
Цитата Сообщение от pgb Посмотреть сообщение
Не понимаю в чём дело и как исправить.
Вам в общем-то довольно ясно написал компилятор в чем дело:
Цитата Сообщение от pgb Посмотреть сообщение
specialization of 'Array<dTYPE>::Array() [with dTYPE = char]' after instantiation
Вы запросили инстанцирование базового шаблона для типа LETTER, а потом только предоставили специализации для него.
Надо сделать наоборот. Специализации должны быть выше места инстанцирования (если все это происходит в одной единице трансляции).
Цитата Сообщение от pgb Посмотреть сообщение
Если в main создаю объект класса Array<LETTER> str; то всё нормально.
Ну так потому и нормально, что в этом случае вы перенесли точку инстанцирования ниже по коду, ниже ваших специализаций.
1
-829 / 16 / 0
Регистрация: 22.09.2015
Сообщений: 901
24.11.2021, 10:16  [ТС] 7
DrOffset, Спасибо, теперь всё понятно.
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,078
24.11.2021, 11:33 8
Цитата Сообщение от pgb Посмотреть сообщение
Для подключения и упрощения компиляции, а также работы IDE(вывода свойств объектов и тд.) так делается.
Не понял. Для какого "подключения и упрощения компиляции"? И при чем здесь "работы IDE"?

Нет, с шаблонным кодом так НЕ делается. Где вы такое видели? Все определения шаблонных сущностей должны сидеть во включаемом файле, то есть в вашем случае в .h файле.

А вот явные специализации уже не являются шаблонными сущностями и, раз уж они вам понадобились, их определения должны располагаться в .cpp файле. Однако объявления всех этих специализаций должны присутствовать в .h файле.

То есть все определения шаблонных методов у вас должны располагаться в .h файле, а также в .h файле должны присутствовать объявления специализаций

C++
1
2
3
template <> Array<LETTER>::Array();
template <> Array<INT_L>::Array();
// И т.д.
---

Намного проще было бы определить все ваши специализации inline и поместить все определения в .h файл. Тогда .cpp файла не понадобилось бы вообще.
1
24.11.2021, 11:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2021, 11:33
Помогаю со студенческими работами здесь

Joomla 3.7.0 & PHP7: Error displaying the error page application instantiation error
Есть 4 сайта, которые я успешно обновил до Joomla 3.7.0. У сайтов возраст разный: от 7 до 1,5 лет....

Error displaying the error page: Application Instantiation Error
после того, как залил на хостинг стала выходить ошибка Your host needs to use PHP 5.3.1 or higher...

Error displaying the error page: Application Instantiation Error
Вот такая ощибка. БД импортнул нормально. Но сайт не пашет.. Добавлено через 3 минуты PS гуглил...

Error displaying the error page: Application Instantiation Error
Добрый вечер, друзья! Нужна помощь. Перенес свой сайт с локалки на masterhost.ru при помощи...

IIS- asp ошибка: HTTP 500.100 - Внутренняя ошибка сервера - ошибка ASP Internet Information Services
Привет! Конфигурация win2000pro sp2, стандартный IIS, IE 5. При попытке обратиться к...

Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи!
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка при чтении изменений...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru