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

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

Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

Шаблоны странная ошибка во время компиляции - C++

27.06.2013, 20:02. Просмотров 571. Ответов 11
Метки нет (Все метки)

Добрый день. Давно не работал с шаблонами... Вроде всё верно, но компилятор выдаёт ошибку:
Bash
1
2
error: undefined reference to 'MyClass<int>::MyClass(int)'
error: collect2: ld returned 1 exit status
Файлы:
MyClass.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef MYCLASS_H
#define MYCLASS_H
 
template <class T>
class MyClass
{
    /* *** */
public:
     MyClass(T);
     /* *** */
};
 
#endif
MyClass.cpp:
C++
1
2
3
4
5
6
7
8
9
#include "MyClass.h"
 
template <class T>
MyClass<T>::MyClass(T val)
{
    /* *** */
}
 
/* *** */
main.cpp:
C++
1
2
3
4
5
6
#include "MyClass.h"
 
int main()
{
    MyClass<int> obj(5);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2013, 20:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны странная ошибка во время компиляции (C++):

Странная ошибка при компиляции проекта - C++
Доброго времени суток Господа. Работаю над проектиком, решил слегка его изменить. Изменил совсем неважные части проекта, грубо говоря,...

ошибка при компиляции проги, использущей шаблоны классов - C++
Возникла ошибка при компиляции проги, использующей шаблоны. Ошибка - undefined symbol /*...*/ in module main.cpp (линковщик не может...

Странная ошибка при компиляции очень очень большой проги ,,boomerang,, - C++
Я в общем, даже и не представляю, куда смотреть в поисках ошибки. Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ...

Ошибка во время компиляции - C++
Выбивает ошибку:&quot;Run-Time Check Failure #3 - The variable 'n' is being used without being defined.&quot; Код:#include &quot;stdafx.h&quot; #include...

Шаблоны. Ошибка компиляции: "Не удается сопоставить определение функции существующему объявлению" - C++
vector.h #pragma once #ifndef _VECTOR_H #define _VECTOR_H #include &lt;exception&gt; template&lt;typename T&gt; class vector...

Шаблоны и определение SSE типов на этапе компиляции - C++
Добрый вечер. Задача следующая: для каждого базового типа даных int, float и double есть свой intrinsic SSE тип - __m128i, __m128 и...

11
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 760
27.06.2013, 20:05 #2
это ругается линкер, а не компилятор
вероятнее всего у вас в проект не включены исходники
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 20:07 #3
Цитата Сообщение от xtorne21st Посмотреть сообщение
Файлы:
раздельная компиляция для шаблонов? Ай-яй
Код шаблона должен быть доступен для инстанционирования
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
27.06.2013, 20:10  [ТС] #4
@Croessmah, @abit, Спасибо, что проявили интерес к моей теме. Но пожалуйста, объясните нубу более простыми словами.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 20:13 #5
Цитата Сообщение от xtorne21st Посмотреть сообщение
Но пожалуйста, объясните нубу более простыми словами.
реализацию шаблонного класса в .h файл с объявлением поместите
2
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
27.06.2013, 20:17  [ТС] #6
Цитата Сообщение от Croessmah Посмотреть сообщение
реализацию шаблонного класса в .h файл с объявлением поместите
Спасибо, насчёт этого я догадался исходя из вашего первого ответа. Мне неясно почему именно так? А именно хотелось узнать толкование вот этой вот фразы:
Цитата Сообщение от Croessmah Посмотреть сообщение
Код шаблона должен быть доступен для инстанционирования
. За ранее, спасибо.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 20:22 #7
Цитата Сообщение от xtorne21st Посмотреть сообщение
Мне неясно почему именно так?
Потому что код шаблона должен быть доступен, иначе из чего компилятор будет создавать код?
Ведь ему нужно откуда-то брать реализацию функций
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
27.06.2013, 20:30  [ТС] #8
@Croessmah, Тогда почему к обычными не шаблонным классам и функциям это не относится?
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
27.06.2013, 20:34 #9
@xtorne21st, какой объектный код должен был бы получиться после компиляции неинстанциированного шаблона (если бы это было возможно)?
1
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 20:35 #10
Цитата Сообщение от xtorne21st Посмотреть сообщение
Тогда почему к обычными не шаблонным классам и функциям это не относится?
Потому что шаблонный класс - ЭТО МАКЕТ, а не конкретный класс.
Вы же не можете жить в чертеже дома, дом нужно построить. А чтобы его построить нужен чертеж того что строить будем
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
27.06.2013, 20:38  [ТС] #11
Всем спасибо, вопросов больше нет.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 20:43 #12
Цитата Сообщение от xtorne21st Посмотреть сообщение
Тогда почему к обычными не шаблонным классам и функциям это не относится?
Для них коды уже написаны и компилятор, встретив, например, вызов не шаблонной функции, только проверяет соответствие вызова прототипу, поэтому в этом файле (компилятор видит в каждый момент только один файл) должен быть прототип функции. Если же компилятор встречает вызов шаблонной функции, он должен создать её код (шаблон это не код, а образец для создания кода), поэтому в этом файле (где находится вызов шаблонной функции) должно быть всё, что ему для этого нужно, т.е. объявление шаблона и его реализация.
1
27.06.2013, 20:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 20:43
Привет! Вот еще темы с ответами:

Странная ошибка - C++
// ConsoleApplication5.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Странная ошибка с else - C++
Мне пишет что в 21 строке ошибка, делал и с цифрами и с текстом, ошибка всегда на else, ошибка: D:\CBProject\Test1\main.cpp||In...

Странная ошибка - C++
#ifndef HUGEINTEGER_H #define HUGEINTEGER_H class HugeInteger { public: ...

Проинициализировать массив во время компиляции - C++
Проблема с распаковкой параметр-пака.#include &lt;utility&gt; constexpr unsigned long long fact(int n) { unsigned long long res = 1;...


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

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

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