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

Специализация шаблона - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.56
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
17.02.2013, 19:15     Специализация шаблона #1
Пытаюсь специализировать шаблон для типа float, но не получается. В чем проблема?
Компилятор:
1>TemplateArr.obj : error LNK2005: "public: __thiscall Array<float>::Array<float>(int)" (??0?$Array@M@@QAE@H@Z) уже определен в Array.obj
1>TemplateArr.obj : error LNK2005: "public: __thiscall Array<float>::~Array<float>(void)" (??1?$Array@M@@QAE@XZ) уже определен в Array.obj
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
#pragma once
 
template <class T>
class Array
{
public:
    Array(int = 10);
    T &getElement(int);
    ~Array(void);
private:
    T *ptr;
};
 
template <class T>
Array<T>::Array(int size)
{
    ptr = new T[size];
    for (int i = 0; i < size; i++)
        ptr[i] = 0;
}
 
template <class T>
Array<T>::~Array(void)
{
    delete [] ptr;
}
 
template <class T>
T &Array<T>::getElement(int number)
{
    return ptr[number];
}
 
 
//тут начинается специализация
template <>
class Array<float>
{
    public:
    Array(int = 10);
    float &getElement(int);
    ~Array(void);
    private:
        float *ptr;
};
 
Array<float>::Array(int number)
{
    ptr = new float[number];
}
 
Array<float>::~Array(void)
{
    delete [] ptr;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2013, 19:15     Специализация шаблона
Посмотрите здесь:

Частичная специализация шаблона C++
C++ Специализация шаблона класса
C++ специализация шаблона функции
C++ специализация шаблона
Явная специализация шаблона C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.02.2013, 19:19     Специализация шаблона #2
C++
1
2
3
4
5
template <>
Array<float>::Array(int number)
{
    //...
}
же
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
17.02.2013, 22:56  [ТС]     Специализация шаблона #3
Если сделать так, то тогда второе слово Array подсвечивается красным,
так как "не является сущностью, для которой допускается явная специализация"

Добавлено через 2 часа 36 минут
up^
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.02.2013, 08:30     Специализация шаблона #4
kebal, Использование увидеть можно? gcc глотает
http://liveworkspace.org/code/1QXOcL$0
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
18.02.2013, 21:02  [ТС]     Специализация шаблона #5
Вот использование
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// TemplateArr.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include "Array.h"
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Array<float> lol(10);
 
    system("pause");
    return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.02.2013, 13:58     Специализация шаблона #6
kebal, Разнес по разным файлам - все продолжает работать. Вашу проблему воспроизвести не удается.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 16:54     Специализация шаблона #7
kebal, среда какая?

Добавлено через 8 минут
Какие файлы в проекте? Что в stdafx.h?

Добавлено через 5 минут
Специализация шаблона в заголовочном файле и он подключен в нескольких файлах. stdafx.h?
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
19.02.2013, 21:32  [ТС]     Специализация шаблона #8
Файл Array.h полностью в первом посте.
Файл Template.arr в моём предыдущем посте.
А вот файл Array.cpp, то есть он по сути пустой, так как мне сказали, что описание функций шаблона должно быть в одном файле с самим шаблоном.
C++
1
2
#include "stdafx.h"
#include "Array.h"
Добавлено через 4 минуты
stdafx.h вот
C++
1
2
3
4
5
6
#pragma once
 
#include "targetver.h"
 
#include <stdio.h>
#include <tchar.h>
Microsoft Visual Studio 2012

Добавлено через 6 минут
ForEveR, создайте просто консольное приложение, а внутри класс и вставьте внутрь него мой первый пост. Неужели у вас так тоже компилируется ? странная у меня ошибка
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 21:39     Специализация шаблона #9
Цитата Сообщение от kebal Посмотреть сообщение
вот файл Array.cpp, то есть он по сути пустой
Какой же он пустой, когда в нём Array.h, а в нём определение специализации шаблона? Удалите его, он лишний.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
19.02.2013, 21:43  [ТС]     Специализация шаблона #10
Вот я и нашёл ответ, ещё порыскав по интернету. Отключив заголовок
#include "Array.h"
в файле Array.cpp всё скомпилировалось, можете объяснить почему?

Добавлено через 51 секунду
alsav22, опередили а почему нельзя его включить?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 22:00     Специализация шаблона
Еще ссылки по теме:

Специализация шаблона C++
C++ Специализация операции шаблона
C++ Специализация шаблона

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 22:00     Специализация шаблона #11
Цитата Сообщение от kebal Посмотреть сообщение
почему нельзя его включить?
Специфика специализаций. Это всё равно, что реализация функции. Должна быть одна в программе.

Добавлено через 12 минут
Если подключать Array.h в нескольких файлах, из него нужно убрать реализацию методов специализации класса (например, поместить их в файл .cpp, вместе с реализациями функций). В отличие от шаблонов, объявление специализации и реализация специализации могут находиться в разных файлах.
Yandex
Объявления
19.02.2013, 22:00     Специализация шаблона
Ответ Создать тему
Опции темы

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