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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
#1

undefined reference to 'std::basic - C++

16.09.2012, 19:44. Просмотров 1822. Ответов 29
Метки нет (Все метки)

Братцы выручайте
Сейчас с ума сойду...

Но сначала исходники

main.cpp

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
56
57
58
59
60
61
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
 
#include "matrix_reading.h"
 
typedef std::vector < std::vector <int> > Vi;
typedef std::vector < std::vector <double> > Vd;
 
 
/*
template <typename T>
std::ostream& operator << (std::ostream& output, const std::vector < std::vector <T> >& mass)
{
     for(int i = 0; i < mass.size(); ++i)
     {
      for(int j = 0; j < mass[i].size(); ++j)
      {
          output << std::setw(6) << mass[i][j];
      }
      output << '\n';
     }
 
     return output;
}
 
// template <typename T>
std::ifstream& operator >> (std::ifstream& input, std::vector <std::vector <double> >& mass)
{
    for(int i=0; i < mass.size(); i++)
    {
        for(int j=0; j < mass[i].size(); j++)
        {
            input >> mass[i][j];
        }
    }
}
 
*/
 
int main()
{
    int row, col;
    std::ifstream inF("text.c");
 
    if (!inF)   std::cout << std::endl << "Error !";
 
    inF >> row;
    inF >> col;
 
  //  std::cout << row << " " << col;
 
   Vd t (row,std::vector <double> (col));
 
   inF >> t;
   std::cout << t;
 
 
    return 0;
}

matrix_reading.h

C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef MATRIX_READING_H
#define MATRIX_READING_H
 
template <typename T>
std::ostream& operator << (std::ostream& output, const std::vector < std::vector <T> >& mass);
 
template <typename T>
std::ifstream& operator >> (std::ifstream& input, std::vector <std::vector <T> >& mass);
 
 
#endif
matrix_reading.cpp

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
#include "matrix_reading.h"
 
template <typename T>
std::ostream& operator << (std::ostream& output, const std::vector < std::vector <T> >& mass)
{
     for(int i = 0; i < mass.size(); ++i)
     {
      for(int j = 0; j < mass[i].size(); ++j)
      {
          output << std::setw(6) << mass[i][j];
      }
      output << '\n';
     }
 
     return output;
}
 
template <typename T>
std::ifstream& operator >> (std::ifstream& input, std::vector <std::vector <double> >& mass)
{
    for(int i=0; i < mass.size(); i++)
    {
        for(int j=0; j < mass[i].size(); j++)
        {
            input >> mass[i][j];
        }
    }
}
Вообщем все работало до тех пор пока я не решил засунуть свои функции в заголовочный файл.
ТО ЕСТЬ
Если вы скопируете себе файл main.cpp раскомментируете функции, и закомментите включение заголовчного файла, то все будет работать нормально.

Когда же подключаю заголовчный выдается вот что:

\Desktop\cpp_examples\my_prog\file_reading.o:file_reading.cpp|| undefined reference to `std::basic_ifstream<char, std::char_traits<char> >& operator>><double>(std::basic_ifstream<char, std::char_traits<char> >&, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&)'|

\Desktop\cpp_examples\my_prog\file_reading.o:file_reading.cpp|| undefined reference to `std::ostream& operator<< <double>(std::ostream&, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&)'|

||=== Build finished: 2 errors, 0 warnings ===|

Компилятор code blocks...

Undefined reference to - не может найти ссылку .. а почему?????
аааа уже нервы вымотало....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2012, 19:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос undefined reference to 'std::basic (C++):

Ошибка undefined reference to `operator<<(std::ostream&, Account)' - C++
Всем здравствуйте! На днях столкнулся с ошибкой, с которой еще не раз не сталкивался, и не знаю как ее исправить. Ошибка выглядит так: ...

Undefined reference to Rhombus::Rhombus(std::istream &) - C++
Доброго времени суток. При компиляции в чистом g++ возникли три похожие ошибки, аналогичные той, что в названии темы, где Rhombus - это...

Странная ошибка: [Linker error] undefined reference to `__dyn_tls_init_callback' [Linker error] undefined reference to ld returned 1 exit status - C++
Здравствуйте. Вот недавно начал изучать книгу &quot;С++ для чайников&quot; Стефан Р. Девис 4-е издание. И напоролся на кучу ошибок) Но смог все...

Undefined reference to - C++
Есть класс NavyPort. Его заголовок: #ifndef NAVYPORT_H #define NAVYPORT_H class NavyPort { public: NavyPort(bool...

Undefined reference to - C++
Matrix.h #pragma once #include &lt;iostream&gt; template &lt;typename T&gt; class Matrix { private: int n1, n2; T **mas; public:...

undefined reference - C++
Пытаюсь разобраться с Box2D. Выпадает куча ошибок типа undefined reference to `b2World::b2World(b2Vec2 const&amp;)'| Box2D.h файл...

29
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.09.2012, 19:49 #2
kotleta, шаблоны инстанцируются на этапе компиляции. Следовательно, реализация(или явное инстанцирование) должны присутствовать в одном файле с вызовом данной функции. Поэтому, либо пихайте реализацию в хедер, либо раскидывайте по двум файлам(hpp и ipp), затем подключаете их в третий файл, после чего подключаете только его.
1
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
16.09.2012, 19:59  [ТС] #3
soon, спасибо за ответ!!
Но я мало чего понял, что такое реализация, инстанцирование, hpp и ip...
можно поподробнее для человека не знающего с++ ....
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.09.2012, 20:10 #4
kotleta, для вашей задачи нет смысла использовать два файла. Подключайте только реализацию. А предварительное объявление функций выкиньте.
0
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 11:58  [ТС] #5
soon, вы как оракул...

Добавлено через 3 часа 55 минут
Я правильно понимаю, что реализация это шаблон уже настроенный под конкретный тип (под int, double) и.т.д.?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.09.2012, 12:00 #6
kotleta, Нет. Просто перенесите определение функций вывода в хедер. Код по стандарту не корректен по идее, ибо ADL.
1
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 12:03  [ТС] #7
Инстанцирование (англ. instantiation) — создание экземпляра класса. В отличие от слова «создание», применяется не к объекту, а к классу. То есть, говорят: (в виртуальной среде) создать экземпляр класса или, другими словами, инстанцировать класс. Порождающие шаблоны используют полиморфное инстанцирование.

У меня вообще-то класс нет, поэтому термин инстанцирование наверное неуместен?

Т.е. шаблон - есть параметризованный класс
А создание конкретного класса из этого параметризованного класса называется инстанцированием
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
17.09.2012, 12:06 #8
kotleta, Ищите инстанцирование шаблона.

ForEveR, Что такое ADL?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.09.2012, 12:08 #9
soon, argument dependent lookup. В std он будет смотреть в первую очередь и если встретит там оператор вывода - в глобальную видимость не будет смотреть. То есть с некорректен я наверное погорячился. Но вот такое использование невозможно

C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T, typename T2>
std::ostream& operator << (std::ostream& stream, const std::pair<T, T2>& p)
{
   stream << "pair";
   return stream;
}
 
int main()
{
   std::pair<int, int> p[] = {std::make_pair(1, 1)};
   std::copy(p, p + sizeof(p) / sizeof(*p), std::ostream_iterator<std::pair<int, int> >(std::cout));
}
1
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 12:45  [ТС] #10
Я совсем запутался..

Нашел определение инстанцирование шаблона - это процесс генерация кода из шаблона по конкретным параметрам
Явное инстанцирование с помощью резервированного слова template
Неявное происходит при вызове функции, или объекта класса

Реализация шаблона - это конкретная сгенерированная функция, или класс

У вас реализация это явное инстанцирование

Добавлено через 3 минуты
Я вставлял
template std::ifstream& operator >> (std::ifstream& input, std::vector <std::vector <double> >&);
и в matrix_reading.h, matrix_reading.cpp, и file_reading

все равно undefined reference

тот вариант, в который шаблонные функции полностью (не прототипы) занести в хедер работает.

А вот с использованием хедера и cpp не работает, хотя

Как здесь на сайте написано http://ipc.susu.ac.ru/8504-4.html не работает у меня
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.09.2012, 12:50 #11
kotleta,
тот вариант, в который шаблонные функции полностью (не прототипы) занести в хедер работает.
Этот вариант и нужен. По другому работать не будет.

На сайте же используется явное истанцирование.
Для этого в .cpp файл вставляем

C++
1
2
template std::ifstream& operator >> (std::ifstream& input, std::vector <std::vector <double> >&);
template std::ostream& operator << (std::ostream&, const std::vector<std::vector<double> >&);
0
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 13:01  [ТС] #12
Так я про это и писал в предыдущем посте, что у меня явное инстанцирование не работает..
работает только с хедером

т.е.

cpp

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
#include "matrix_reading.h"
 
 
template <typename T>
std::ostream& operator << (std::ostream& output, const std::vector < std::vector <T> >& mass)
{
     for(int i = 0; i < mass.size(); ++i)
     {
      for(int j = 0; j < mass[i].size(); ++j)
      {
          output << std::setw(6) << mass[i][j];
      }
      output << '\n';
     }
 
     return output;
}
 
template <typename T>
std::ifstream& operator >> (std::ifstream& input, std::vector <std::vector <T> >& mass)
{
    for(int i=0; i < mass.size(); i++)
    {
        for(int j=0; j < mass[i].size(); j++)
        {
            input >> mass[i][j];
        }
    }
}
 
 
template std::ifstream& operator >> (std::ifstream& input, std::vector <std::vector <double> >&mass);
template std::ostream& operator << (std::ostream&, const std::vector<std::vector<double> >&mass);
h

C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef MATRIX_READING_H
#define MATRIX_READING_H
 
template <typename T>
std::ostream& operator << (std::ostream& output, const std::vector < std::vector <T> >& mass);
 
template <typename T>
std::ifstream& operator >> (std::ifstream& input, std::vector <std::vector <T> >& mass);
 
 
#endif
не работает
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.09.2012, 13:10 #13
kotleta, Не знаю. У меня все ок.

C++
1
2
3
4
5
6
 //new.h
#include <iosfwd>
#include <vector>
 
template<typename T>
std::ostream& operator << (std::ostream&, const std::vector<T>&);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 //new.cpp
#include "new.h"
#include <typeinfo>
#include <iostream>
 
template<typename T>
std::ostream& operator << (std::ostream& stream, const std::vector<T>&)
{
   stream << typeid(typename std::vector<T>::value_type).name();
   return stream;
}
 
template std::ostream& operator << (std::ostream&, const std::vector<int>&);
C++
1
2
3
4
5
6
7
8
9
10
 //some.cpp
#include "new.h"
#include <iostream>
#include <vector>
 
int main()
{
   std::vector<int> v;
   std::cout << v << std::endl;
}
Bash
1
2
3
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp new.h some.cpp
forever@pterois:~/My_pro1/cpp_pro$ ./new 
i
1
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 13:14  [ТС] #14
У меня code blocks


И выдает \Desktop\cpp_examples\forums\some.o:some.cpp|| undefined reference to `std::ostream& operator<< <int>(std::ostream&, std::vector<int, std::allocator<int> > const&)'|

Похоже он это не поддерживает, а gcc да
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.09.2012, 13:18 #15
kotleta, code blocks это не компилятор. Это IDE. А вот какой у вас компилятор - вопрос. Попробуйте так заюзать

C++
1
template std::ostream& operator << <int> (std::ostream&, const std::vector<int>&);
0
17.09.2012, 13:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2012, 13:18
Привет! Вот еще темы с ответами:

undefined reference to - C++
http://www.cyberforum.ru/qt/thread861722.html Не в том разделе создал тему, и поэтому даю линк на неё. Описание ошибки там же

undefined reference - C++
Доброго времени суток! Есть следующий код: #include &lt;iostream&gt; using namespace std; enum direction {Up, Down, Left, Right}; ...

Undefined reference to - C++
Помогите, пожалуйста. Нужно было написать программу с использованием шаблона. Появляется ошибка &quot;undefined reference to...

Undefined reference to - C++
Много уже тем создано по даннму вопросу, но решения так и не нашел.. Есть конечно догадки, но как реализовать все равно не знаю. Прошу...


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

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

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