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

Как правильно разделить файл в шаблонами? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ побитовый анализ переменной http://www.cyberforum.ru/cpp-beginners/thread354774.html
Привет, товарищи. Есть вот такая задача: Сосчитать разницу между всеми единичными и нулевыми значениями слова (8 бит). Например, вход 1100 1100 выход 0000 0000. вход 1111 1111 выход 0000 1000 вариант с A={0}, B={1} A > B не предусмотрен. Может кто подкинет идею?
C++ Graphical library Всем привет! Подскажите пожалуйста графическую библиотеку. (Linux-> C++ -> Code Blocks). Желательно схожее с Visual Studio, где есть дизайнер элементов управления, примерно как Visual Studio + WinForms http://www.cyberforum.ru/cpp-beginners/thread354758.html
C++ Массив C++
Нужна помощь,заранее спасибо. Дан вещественный массив n от 20,определить для каждого массива является ли он возрастающим послед. и вычисления средне-геометрического всех положительных элементов массива.
Разбираю списки .Правильно ли понял ? C++
А если нет - укажите где ошибки у меня . и 1) Правильный ли код с точки зрения понимания ? 2) Как бы выглядела более оптимизированная версия ?
C++ Что за оператор ->? http://www.cyberforum.ru/cpp-beginners/thread354722.html
Здравствуйте, мой вопрос поместился в заголовок:), но я всё же задам его и в сообщении: что за оператор ->?
C++ Ввод двух чисел с клавиатуры и вывод их на экран 126(16 с с )и 11110001010(2 с с ) подробнее

Показать сообщение отдельно
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587

Как правильно разделить файл в шаблонами? - C++

22.09.2011, 05:22. Просмотров 4580. Ответов 5
Метки (Все метки)

Попробовал разделить один файл на два. В заголовочный "proba.h" поместил прототип шаблона и специализацию. В одном файле исходного кода оставил функцию main(), а во второй поместил определения шаблона и специализации.

Заголовочный файл "proba.h":
C++
1
2
3
template <class T>
T max5(T m[], int x);
template <> const char* max5(const char* m[], int x);
Первый файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
#include "proba.h"
 
int main()
{
     int t[6] = {777, 34, 34, 66, 777, 1234};
         int l = max5(t, 6);
         cout << l << endl;
 
    double t2[4] = {7.98, 7.90, 3.676, 6.56};
    double l2 = max5(t2, 4);
        cout << l2 << endl;
        
        const char* uk[4] = {"sd","987654321", "qwertyu", "123456789"};
        const char* n = max5(uk, 4);
        cout << &n << "  " << n <<  endl;
        
        system ("pause");
    return 0;
}
Второй файл:
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
#include <iostream>
using namespace std;
#include "proba.h"
 
template <> const char* max5<const char*>( const char* m[], int x)
{
    int n = 0;
        unsigned int p = strlen (m[0]);
        for (int i = 1; i < x; i++)
        if (p < strlen (m[i]))
        {
                p = strlen (m[i]);
                n = i;
        }
 
        return m[n];
}       
 template <class T>
 T max5(T m[], int x)
{
        T p = m[0];
        for (int i = 1; i < x; i++)
        { 
                if (p < m[i]) p = m[i];
        }               
        return p;       
}
При постоении выдаёт ошибки:
1>------ Построение начато: проект: 8-1, Конфигурация: Debug Win32 ------
1> 8-1.cpp
1> Создание кода...
1> Компиляция...
1> 8-2.cpp
1> Создание кода...
1>8-1.obj : error LNK2019: ссылка на неразрешенный внешний символ "double __cdecl max5<double>(double * const,int)" (??$max5@N@@YANQANH@Z) в функции _main
1>8-1.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl max5<int>(int * const,int)" (??$max5@H@@YAHQAHH@Z) в функции _main
1>D:\MY C++Projects\8-4-5\Debug\8-1.exe : fatal error LNK1120: 2 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Если же определене шаблона и специализации тоже записать в заголовочный файл, а не во второй файл исходного кода, то всё проходит нормально. Но если создать второй файл исходного кода (с этим заголовочным файлом) и в нём использовать шаблон, то компоновщик выдаёт ошибку:fatal error LNK1169: обнаружен многократно определенный символ - один или более.
Это из за того, что определения шаблона и специализации присутствуют (через заголовочный файл) и в первом файле и во втором. Как правильно это всё делается? С функциями получается, а с шаблонами непонятно как правильно делать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru