2 / 2 / 0
Регистрация: 05.11.2014
Сообщений: 14
1

Различное поведение конструктора шаблонного класса в зависимости от типа параметра

05.11.2014, 20:58. Показов 1690. Ответов 4
Метки нет (Все метки)

Здравствуйте.
Возникла проблема - при попытке изменить поведение конструктора шаблонного класса (структуры) в зависимости от типа параметра шаблона возникает ошибка компиляции (error: cannot convert ‘std::basic_string<char>’ to ‘int’ in assignment
d = "String " + temp). В принципе я понимаю, что в конструкторе написан бред, но других идей что-то нет, пожалуйста подскажите как решить возникшую проблему, заранее спасибо.
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
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string> 
#include <sstream> // to stringstream
#include <typeinfo>
#define ARR_SIZE 10
using namespace std;
typedef int temp_t;
 
template<class T>
struct data {
    data();
    T d;
    bool operator < (data &a) {
        return d < a.d;
    }
    bool operator > (data &a) {
        return d > a.d;
    }
    bool operator == (data &a) {
        return d == a.d;
    }
    void operator = (data &a) {
        d = a.d;
    }
    void print(){
        cout << d << ' ';
    }
    static int counter;
};
template<class T>
int data<T>::counter = 0;
 
template<class T>
data<T>::data() {
    if (typeid(T) == typeid(string)) {  
        stringstream ss;                   // надо чтобы при T == string выполнялся этот код
        ss << counter++;
        string temp;
        ss >> temp;
        d = "String " + temp;
    } else if (typeid(T) == typeid(int)) {
        d = counter++;                      // а, при T == int этот
        d = d%2 ? d*d : d *= -1 ;
    }
}
 
template<class T>
void swap(T **arr, int i, int j) {
    T temp = *arr[i];
    *arr[i] = *arr[j];
    *arr[j] = temp;
}
 
template<class T>
void qsort(T *arr, int left, int right) {
    int i,last;
    
    if ( left >= right) // if array contents less then two elements
        return;
    swap(arr, left, (left + right)/2); // choose middle element (by order)
    last = left;
    for ( i = left+1; i <= right; i++ )
        if ( *arr[i] > *arr[left] )
            swap(arr, ++last, i);
        
    swap(arr, left, last);
    qsort(arr, left, last);
    qsort(arr, last+1, right);
}
 
int main() {
    struct data<temp_t> *arr[ARR_SIZE];
    for(int i = 0; i < ARR_SIZE; i++)
        arr[i] = new struct data<temp_t>;
    for_each(arr, arr+ARR_SIZE, mem_fun(&data<temp_t>::print));
    cout << endl;
    qsort(arr, 0, ARR_SIZE - 1);
    for_each(arr, arr+ARR_SIZE, mem_fun(&data<temp_t>::print));
    cout << endl;
    
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2014, 20:58
Ответы с готовыми решениями:

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); }...

Перегрузка оператора шаблонного класса в зависимости от типа
Как заставить шаблон различать тип переменной которую ему передают? Пробую определить через...

Чтение с .txt и различное поведение программы в зависимости от его содержимого
Ребят суть такая : Мне надо чтобы было считывание с файла 'settings.txt' Там будет находиться...

Вызов конструктора шаблонного класса
Есть шаблонный класс стек, он является полем в классе Express, но компилятор выдает ошибку &quot;...

4
17094 / 9116 / 2233
Регистрация: 30.01.2014
Сообщений: 15,895
05.11.2014, 21:12 2
Лучший ответ Сообщение было отмечено КириллКВ как решение

Решение

КириллКВ, используй специализацию.

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <>
data<string>::data()
{
    stringstream ss;                   // надо чтобы при T == string выполнялся этот код
    ss << counter++;
    string temp;
    ss >> temp;
    d = "String " + temp;
}
 
template <>
data<int>::data()
{
    d = counter++;                      // а, при T == int этот
    d = d%2 ? d*d : d *= -1 ;
}
Добавлено через 1 минуту
typeid - это runtime (RTTI), шаблоны - compile-time. Кислое с пресным смешивать можно, но не вкусно.
1
2 / 2 / 0
Регистрация: 05.11.2014
Сообщений: 14
05.11.2014, 21:12  [ТС] 3
О таком ещё не слышал, спасибо посмотрю.
0
17094 / 9116 / 2233
Регистрация: 30.01.2014
Сообщений: 15,895
05.11.2014, 21:13 4
Лучший ответ Сообщение было отмечено КириллКВ как решение

Решение

Цитата Сообщение от КириллКВ Посмотреть сообщение
О таком ещё не слышал, спасибо посмотрю.
О таком лучше прочитать . Например здесь.
1
2 / 2 / 0
Регистрация: 05.11.2014
Сообщений: 14
05.11.2014, 21:20  [ТС] 5
Большое спасибо всё работает.
Да надо почитать...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2014, 21:20
Помогаю со студенческими работами здесь

Неявный вызов конструктора шаблонного класса при операции сравнения
Реализовал шаблонный класс целых чисел, для использования его в шаблонном классе дробей. Звучит...

Поведение решения в зависимости от параметра
ma(t)=wv(t)+kx(t) m&gt;0,w,k&gt;0 - коэффициенты исследовать поведения решений в зависимости от...

Определение типа члена шаблонного класса
Такая проблема. Есть шаблонный класс с членом - указателем, тип которого должен определяться в...

Хранение вектора экземпляров шаблонного класса неизвестного типа
Здравствуйте! Потребовалось хранить вектор экземпляров шаблонного класса неизвестного типа. Для...

Явная специализация метода для типа шаблонного класса
Добрый вечер, уважаемые знатоки! :) Хочу задать вопрос по созданию шаблонов. В общем, пусть у меня...

Decltype при определении возвращаемого типа в перегруженных операторах шаблонного класса
Для всех следующих примеров будет использован main(): #include &lt;iostream&gt; int main() {...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru