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

c++ ссылка на внешний символ - C++

Восстановить пароль Регистрация
 
NinjaNoob
1 / 1 / 0
Регистрация: 21.12.2012
Сообщений: 19
04.04.2013, 22:56     c++ ссылка на внешний символ #1
Тип проэкта: консольное приложение win32

При компиляции появляются следующие ошибки:
C++
1
2
3
4
5
6
7
8
9
10
Ошибка  1   error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl Draw<int>(int,int,int)" (??$Draw@H@@YAHHHH@Z) в функции "int __cdecl _main(void)" (?_main@@YAHXZ)    
C:\Users\Вадим\documents\visual studio 2010\Projects\FigureTemplate\FigureTemplate\FigureTemplate.obj
Ошибка  2   error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl Draw<int>(int,int)" (??$Draw@H@@YAHHH@Z) в функции "int __cdecl _main(void)" (?_main@@YAHXZ) 
C:\Users\Вадим\documents\visual studio 2010\Projects\FigureTemplate\FigureTemplate\FigureTemplate.obj
Ошибка  3   error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl Draw<int>(int)" (??$Draw@H@@YAHH@Z) в функции "int __cdecl _main(void)" (?_main@@YAHXZ)  
C:\Users\Вадим\documents\visual studio 2010\Projects\FigureTemplate\FigureTemplate\FigureTemplate.obj
Ошибка  4   error LNK2019: ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup    
C:\Users\Вадим\documents\visual studio 2010\Projects\FigureTemplate\FigureTemplate\MSVCRTD.lib(crtexe.obj)
Ошибка  5   error LNK1120: 4 неразрешенных внешних элементов    
C:\Users\Вадим\documents\visual studio 2010\Projects\FigureTemplate\Debug\FigureTemplate.exe    1
Файл FigureTemplate.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include <iostream>
#include <locale>
#include "figure.h"
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "RUS");
    figure fig;
    fig.a=10;
    fig.b=15;
    fig.c=20;
    cout<<"Площадь квадрата="<<Draw(fig.a)<<"\n";
    cout<<"Площадь треугольника="<<Draw(fig.a, fig.b)<<"\n";
    cout<<"Площадь трапеции="<<Draw(fig.a, fig.b, fig.c)<<"\n";
    return 0;
}
Файл figure.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class Type>
Type Draw(Type a); 
 
template <class Type>
Type Draw(Type a, Type b);
 
template <class Type>
Type Draw(Type a, Type b, Type c);
 
struct figure {
    int a;
    int b;
    int c;
};
Файл figure.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include "figure.h"
 
template <class Type>
Type Draw(Type a) {
    return a*a;
}
 
template <class Type>
Type Draw(Type a, Type b) {
    return (a*b)/2;
}
 
template <class Type>
Type Draw(Type a, Type b, Type c) {
    return (a+b)/2*c;
}
гуглил долго
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.04.2013, 22:57     c++ ссылка на внешний символ #2
NinjaNoob, определения шаблонных функций и классов должны быть в заголовке а не в отдельной единице трансляции. Перенесите все определения в figure.h
NinjaNoob
1 / 1 / 0
Регистрация: 21.12.2012
Сообщений: 19
04.04.2013, 23:06  [ТС]     c++ ссылка на внешний символ #3
Toshkarik, спасибо огромное! А почему так? Ну там принцип модульности и всё такое
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
04.04.2013, 23:14     c++ ссылка на внешний символ #4
Цитата Сообщение от NinjaNoob Посмотреть сообщение
А почему так? Ну там принцип модульности и всё такое
Потому что шаблон должен быть доступен во время инстанцирования
Yandex
Объявления
04.04.2013, 23:14     c++ ссылка на внешний символ
Ответ Создать тему
Опции темы

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