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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.56
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
#1

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

17.02.2013, 19:15. Просмотров 1126. Ответов 10
Метки нет (Все метки)

Пытаюсь специализировать шаблон для типа 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2013, 19:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Специализация шаблона (C++):

специализация шаблона - C++
начал разбираться с шаблонами. если есть структура, и одна функция именно с int должна работать по особенному, написать можно вот так. ...

Специализация шаблона - C++
Привет, у меня есть вот такой шаблон дерева: template &lt;typename T = int&gt; class Tree{ struct TreeItem{ // элемент дерева ...

Специализация шаблона - C++
Здравствуйте! Задача: Создайте шаблонную функцию maxn(), которая принимает в качестве аргумента массив элементов типа Т и целое...

Частичная специализация шаблона - C++
Доброго всем времени суток! Помогите разобраться в следующей ситуации. Есть шаблон класса #include &lt;iostream&gt; using...

Явная специализация шаблона - C++
Здравствуйте, подскажите, пожалуйста, почему не выполняется неявное приведение фактических параметров к формальным при вызове функции для...

Специализация шаблона функции - C++
Как сделать специализированную функцию шаблон на тип int? У меня что-то не получается ..

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

Добавлено через 2 часа 36 минут
up^
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
18.02.2013, 08:30 #4
kebal, Использование увидеть можно? gcc глотает
http://liveworkspace.org/code/1QXOcL$0
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;
}
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.02.2013, 13:58 #6
kebal, Разнес по разным файлам - все продолжает работать. Вашу проблему воспроизвести не удается.
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 16:54 #7
kebal, среда какая?

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

Добавлено через 5 минут
Специализация шаблона в заголовочном файле и он подключен в нескольких файлах. stdafx.h?
0
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, создайте просто консольное приложение, а внутри класс и вставьте внутрь него мой первый пост. Неужели у вас так тоже компилируется ? странная у меня ошибка
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 21:39 #9
Цитата Сообщение от kebal Посмотреть сообщение
вот файл Array.cpp, то есть он по сути пустой
Какой же он пустой, когда в нём Array.h, а в нём определение специализации шаблона? Удалите его, он лишний.
1
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
19.02.2013, 21:43  [ТС] #10
Вот я и нашёл ответ, ещё порыскав по интернету. Отключив заголовок
#include "Array.h"
в файле Array.cpp всё скомпилировалось, можете объяснить почему?

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

Добавлено через 12 минут
Если подключать Array.h в нескольких файлах, из него нужно убрать реализацию методов специализации класса (например, поместить их в файл .cpp, вместе с реализациями функций). В отличие от шаблонов, объявление специализации и реализация специализации могут находиться в разных файлах.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 22:00
Привет! Вот еще темы с ответами:

Явная специализация шаблона - C++
Здравствуйте. Не совсем разобрася с сабжем. Например, если есть кусочек кода: template &lt;typename T&gt; void func(T &amp;blue, T &amp;red); ...

Специализация операции шаблона - C++
Доброго времени суток. Имеется шаблон: template&lt;class Type&gt;class Figures { /*...*/ public: /*...*/ void...

Явная специализация шаблона - C++
Столкнулся с проблемой при изучении шаблонов. Задача: написать шаблонную функцию, которая принимает в качестве аргумента массив...

Специализация шаблона класса - C++
Имеется задание: Создать свой шаблонный класс – динамический массив (myvector). Создать методы этого класса. Инстанцировать для своего...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.02.2013, 22:00
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru