35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
1

шаблонные функции

31.03.2013, 18:20. Показов 2874. Ответов 18
Метки нет (Все метки)

Добрый день, у меня есть куча файлов, мне необходимо с ними работать, но данные в них разные, пытаюсь сделать через шаблон..не получается. прошу помощи
C++ (Qt)
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
template <typename T>  //шаблонные функции для конвертирования из строки
    T FromString(const QString & str);
 
    template <>
    int FromString<int>(const QString & str)
    {
       return str.toInt();
    }
 
    template <>
    float FromString<float>(const QString & str)
    {
       return str.toFloat();
    }
 
 
    template <typename T>
    void Calc_etalon (QDir & DirTxt)
    {
        //QDir DirTxt(Path);
        QVector <T> vec;
        vec.clear();
        foreach (const QString & fName, DirTxt.entryList(QStringList ("*.txt") )) //цикл по всем txt
        {
            QFile file( (DirTxt.path()+fName).toAscii() ) ;
            file.open(QIODevice::ReadWrite | QIODevice::Text); //открываем файл для чтения и записи
            while (!file.atEnd())
            {
                QByteArray line = file.readLine();
                QString str = line.data();//прочитанная строка
                vec.push_back(FromString<T>(str));                
            }//вектор заполнен данными из файла
 
            size_t etalon=0;
            for (size_t i=0; i<vec.size(); ++i)
            {
                etalon+=vec[i];
            }
            vec.push_back(etalon/vec.size());
            QTextStream out(&file);
            out << vec.last();//записываем эталон в конец файла
            file.close();
        }
    }
C++
1
2
3
4
5
6
7
..\DefineTheCell\/mainwindow.h:391:15: error: explicit specialization in non-namespace scope 'class MainWindow'
..\DefineTheCell\/mainwindow.h:392:44: error: template-id 'FromString<int>' in declaration of primary template
..\DefineTheCell\/mainwindow.h:397:15: error: explicit specialization in non-namespace scope 'class MainWindow'
..\DefineTheCell\/mainwindow.h:398:48: error: template-id 'FromString<float>' in declaration of primary template
..\DefineTheCell\/mainwindow.h:398:11: error: 'float MainWindow::FromString(const QString&)' cannot be overloaded
..\DefineTheCell\/mainwindow.h:392:9: error: with 'int MainWindow::FromString(const QString&)'
..\DefineTheCell\/mainwindow.h:405:10: error: too many template-parameter-lists
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2013, 18:20
Ответы с готовыми решениями:

Шаблонные классы
Вообщем проблема такая. Если я класс полностью описываю в main.cpp то все хорошо. Но как только я...

Шаблонные коды(?) в Qt Creator
Здравствуйте. Прошу, подскажите как называется код, вызываемый автоматически по ключевому слову, и...

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

Шаблонные функции
Чет не получается написать шаблонную функцию. func.h template &lt;class T&gt; T strnstr (T str, T...

18
Эксперт С++
8384 / 6146 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.03.2013, 18:24 2
Думаю вам стоит привести весь код класса ...

Да и почему не в Qt раздел ?
0
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
31.03.2013, 18:30  [ТС] 3
да это MainWindow

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Да и почему не в Qt раздел ?
ошибся

Добавлено через 50 секунд
не думаю, что тут есть место специфике
0
Эксперт С++
8384 / 6146 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.03.2013, 18:39 4
Цитата Сообщение от Sor Посмотреть сообщение
да это MainWindow
Прдон сразу не въехал в код...
Цитата Сообщение от Sor Посмотреть сообщение
не думаю, что тут есть место специфике
Да но, проверить не все могут ваш код .

Как применяете шаблон ф-ции ?
0
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
31.03.2013, 18:47  [ТС] 5
C++ (Qt)
1
Calc_etalon(DirTxt);
вызов.
но у меня не компилируется без него даже)

раньше у меня было
C++ (Qt)
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
 template <typename T>
    void Calc_etalon (QDir & DirTxt)
    {
        //QDir DirTxt(Path);
        QVector <T> vec;
        vec.clear();
        foreach (const QString & fName, DirTxt.entryList(QStringList ("*.txt") )) //цикл по всем txt
        {
            QFile file( (DirTxt.path()+fName).toAscii() ) ;
            file.open(QIODevice::ReadWrite | QIODevice::Text); //открываем файл для чтения и записи
            while (!file.atEnd())
            {
                QByteArray line = file.readLine();
                QString str = line.data();//прочитанная строка
                vec.push_back(str.toInt());              ////////////////вместо vec.push_back(FromString<T>(str));      
            }//вектор заполнен данными из файла
 
            size_t etalon=0;
            for (size_t i=0; i<vec.size(); ++i)
            {
                etalon+=vec[i];
            }
            vec.push_back(etalon/vec.size());
            QTextStream out(&file);
            out << vec.last();//записываем эталон в конец файла
            file.close();
        }
    }
и все было хорошо, но оказалось, что есть файлы с float внутри..
0
Эксперт С++
8384 / 6146 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.03.2013, 18:50 6
Ваш код у меня компилиться.

Что касается
Цитата Сообщение от Sor Посмотреть сообщение
C++ (Qt)
1
Calc_etalon(DirTxt);
То у компилятора нет возможности узнать что использовать int или float.
Пробуйте
C++ (Qt)
1
2
3
Calc_etalon<int>(DirTxt);
// и
Calc_etalon<float>(DirTxt);
Но при любом раскладе "шаблон" никак не сможет определить что именно внутри файла, нужно указывать явно.
1
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
31.03.2013, 18:52 7
Цитата Сообщение от Sor Посмотреть сообщение
да это MainWindow
Специализации методов должны быть описаны вне класса, об этом говорит
Цитата Сообщение от Sor Посмотреть сообщение
Код
error: explicit specialization in non-namespace scope 'class MainWindow'
1
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
31.03.2013, 18:52  [ТС] 8
Цитата Сообщение от Avazart Посмотреть сообщение
Ваш код у меня компилиться.
можно мне проект?
0
Эксперт С++
8384 / 6146 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.03.2013, 19:03 9
Цитата Сообщение от Sor Посмотреть сообщение
можно мне проект?
У меня Qt5, а у вас как я понимаю Qt4.x имеет смысл?

Цитата Сообщение от gray_fox Посмотреть сообщение
Специализации методов должны быть описаны вне класса, об этом говорит
А что у него там метод ?
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
31.03.2013, 19:12 10
Цитата Сообщение от Avazart Посмотреть сообщение
А что у него там метод ?
FromString, видимо.

Добавлено через 1 минуту
Я, глядя на ошибки, предполагаю.
0
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
31.03.2013, 19:13  [ТС] 11
C++ (Qt)
1
2
template <typename T> 
    T FromString(const QString & str);
шаблон

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
template <>
    int FromString<int>(const QString & str)
    {
       return str.toInt();
    }
 
    template <>
    float FromString<float>(const QString & str)
    {
       return str.toFloat();
    }
специализации.
верно?

выношу специализации, ошибки: ..\DefineTheCell\/mainwindow.h: At global scope:
..\DefineTheCell\/mainwindow.h:497:15: error: expected initializer before '<' token
..\DefineTheCell\/mainwindow.h:503:17: error: expected initializer before '<' token

выношу шаблон к ним, ошибки ..\DefineTheCell\/mainwindow.h:409:31: error: 'FromString' was not declared in this scope
..\DefineTheCell\/mainwindow.h:409:43: error: expected primary-expression before '>' token


как мне правильно вынести их?)
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
31.03.2013, 19:20 12
Sor, так это член класса MainWindow?

Добавлено через 3 минуты
Если да, то так:
C++
1
2
3
4
5
6
7
8
9
template<>
int MainWindow::FromString<int>(const QString & str) {
   // ...
}
 
template <>
float MainWindow::FromString<float>(const QString & str) {
   // ...   
}
0
Эксперт С++
8384 / 6146 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.03.2013, 19:20 13
Ну да по коду не скажешь, а в ошибках
error: 'float MainWindow::FromString(const QString&)' cannot be overloaded
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
31.03.2013, 19:23 14
Или так, кстати:
C++
1
2
3
4
5
6
7
8
9
template<>
int MainWindow::FromString(const QString & str) {
   // ...
}
 
template <>
float MainWindow::FromString(const QString & str) {
   // ...   
}
1
Эксперт С++
8384 / 6146 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.03.2013, 19:48 15
Там еще что-то со строчками
C++ (Qt)
1
2
3
QFile file( (DirTxt.path()+fName).toLatin1() ) ; // c.toLatin1() if Qt5
//...
QTextStream out(&file);// <- ошибка
ошибка: 'QTextStream out' has incomplete type
Добавлено через 20 минут
C++ (Qt)
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
#include <QMainWindow>
#include <QDir>
#include <QFile>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
    template <typename T>
    T FromString(const QString & str);
 
    template <typename T>
    void Calc_etalon (QDir & DirTxt);
    
private slots:
    void on_pushButton_clicked();
 
private:
    Ui::MainWindow *ui;
};
C++ (Qt)
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
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
//------------------------------------------------------------
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
//------------------------------------------------------------
MainWindow::~MainWindow()
{
    delete ui;
}
//------------------------------------------------------------
template <typename T>
T MainWindow::FromString(const QString & str)
{
 // А что тут надо делать ???
}
//------------------------------------------------------------
template <>
int MainWindow::FromString<int>(const QString & str)
{
  return str.toInt();
}
//------------------------------------------------------------
template<>
float MainWindow:: FromString<float>(const QString & str)
{
  return str.toFloat();
}
//------------------------------------------------------------
template <typename T>
void  MainWindow::Calc_etalon (QDir & DirTxt)
    {
        //QDir DirTxt(Path);
        QVector <T> vec;
        vec.clear();
        foreach (const QString & fName, DirTxt.entryList(QStringList ("*.txt") )) //цикл по всем txt
        {
            QFile file( (DirTxt.path()+fName).toLatin1() ) ;
            file.open(QIODevice::ReadWrite | QIODevice::Text); //открываем файл для чтения и записи
            while (!file.atEnd())
            {
                QByteArray line = file.readLine();
                QString str = line.data();//прочитанная строка
                vec.push_back(FromString<T>(str));
            }//вектор заполнен данными из файла
 
            int etalon=0;
            for (int i=0; i<vec.size(); ++i)
            {
                etalon+=vec[i];
            }
            vec.push_back(etalon/vec.size());
            //  Тут что неправильно подставляется :
            //QTextStream out(&file);
            //out << vec.last();//записываем эталон в конец файла
            file.close();
        }
    }
//------------------------------------------------------------
void MainWindow::on_pushButton_clicked()
{
    // Тест 
    QDir Dir(".");
    Calc_etalon<int> (Dir);
}
//------------------------------------------------------------
1
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
31.03.2013, 19:54  [ТС] 16
вроде получилось, попробую на данных сейчас
0
DU
1499 / 1145 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
31.03.2013, 19:57 17
C++
1
2
3
4
5
template <typename T>
T MainWindow::FromString(const QString & str)
{
 // А что тут надо делать ???
}
ничего не надо делать. Автор хотел, чтобы это работало для интов и для флоатов. поэтому общая функция не имеет имплементации и при попытке ее заюзать будет ошибка компиляции.
Еще можно попробовать написать одну реализацию на все типы, для которых определен оператор <<. что-нибудь вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <sstream>
#include <QString>
 
template <typename T>
T FromString(const QString& str)
{
    std::istringstream iss(str.toStdString());
    T obj;
    iss >> obj;
    return obj;
}
И еще: в изначальном примере функции конвертирования были свободными функциями. зачем их делать методами класса? они обращаются к методам\полям класса? вроде нет. все что им надо для работы - это переданная в них строка. значит оформляем их в виде свободных функций в отдельном файле и подключаем его туда, где они могут понадобится.
1
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
31.03.2013, 19:59 18
Sor, что-то не так делаешь, вот пример: http://ideone.com/iEUmvQ .
1
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
31.03.2013, 20:27  [ТС] 19
Большое спасибо за помощь.

сделал так:
Цитата Сообщение от DU Посмотреть сообщение
template <typename T> T FromString(const QString& str) { std::istringstream iss(str.toStdString()); T obj; iss >> obj; return obj; }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2013, 20:27
Помогаю со студенческими работами здесь

Шаблонные функции
Читал у Праты про шаблонные функции, и везде они описаны наподобие template &lt;typename Any&gt; void...

Шаблонные функции
Такой код работает. #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cstring&gt; using namespace...

Шаблонные функции
Помогите, пожалуйста, реализовать шаблонную функцию, которая переставляет элементы в массиве

Шаблонные функции
С помощью http://ru.wikipedia.org/wiki/Шаблоны_C%2B%2B пытался написать программу с шаблонной...


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

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

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