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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
16.09.2012, 19:44     undefined reference to 'std::basic #1
Братцы выручайте
Сейчас с ума сойду...

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

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 - не может найти ссылку .. а почему?????
аааа уже нервы вымотало....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2012, 19:44     undefined reference to 'std::basic
Посмотрите здесь:

C++ undefined reference...
C++ Странная ошибка: [Linker error] undefined reference to `__dyn_tls_init_callback' [Linker error] undefined reference to ld returned 1 exit status
C++ undefined reference
C++ undefined reference
C++ undefined reference to `A::a'
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.09.2012, 19:49     undefined reference to 'std::basic #2
kotleta, шаблоны инстанцируются на этапе компиляции. Следовательно, реализация(или явное инстанцирование) должны присутствовать в одном файле с вызовом данной функции. Поэтому, либо пихайте реализацию в хедер, либо раскидывайте по двум файлам(hpp и ipp), затем подключаете их в третий файл, после чего подключаете только его.
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
16.09.2012, 19:59  [ТС]     undefined reference to 'std::basic #3
soon, спасибо за ответ!!
Но я мало чего понял, что такое реализация, инстанцирование, hpp и ip...
можно поподробнее для человека не знающего с++ ....
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.09.2012, 20:10     undefined reference to 'std::basic #4
kotleta, для вашей задачи нет смысла использовать два файла. Подключайте только реализацию. А предварительное объявление функций выкиньте.
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 11:58  [ТС]     undefined reference to 'std::basic #5
soon, вы как оракул...

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

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

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

ForEveR, Что такое ADL?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.09.2012, 12:08     undefined reference to 'std::basic #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));
}
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 12:45  [ТС]     undefined reference to 'std::basic #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 не работает у меня
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.09.2012, 12:50     undefined reference to 'std::basic #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> >&);
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 13:01  [ТС]     undefined reference to 'std::basic #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
не работает
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.09.2012, 13:10     undefined reference to 'std::basic #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
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 13:14  [ТС]     undefined reference to 'std::basic #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 да
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.09.2012, 13:18     undefined reference to 'std::basic #15
kotleta, code blocks это не компилятор. Это IDE. А вот какой у вас компилятор - вопрос. Попробуйте так заюзать

C++
1
template std::ostream& operator << <int> (std::ostream&, const std::vector<int>&);
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 13:48  [ТС]     undefined reference to 'std::basic #16
ForEvEr и это тоже((
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.09.2012, 13:54     undefined reference to 'std::basic #17
kotleta, Компилятор какой? Как посмотреть это в Code Blocks разбирайтесь сами.
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 13:58  [ТС]     undefined reference to 'std::basic #18
В настройках стоит GNU GCC COMPILER

Добавлено через 2 минуты
С++ complier mingw32-g++.exe это экзешник компилятора
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.09.2012, 14:04     undefined reference to 'std::basic #19
kotleta, Версия? mingw32-g++.exe -v что выдает (набирать в консоли)?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2012, 14:29     undefined reference to 'std::basic
Еще ссылки по теме:

Ошибка undefined reference C++
undefined reference to C++
Undefined reference to C++

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

Или воспользуйтесь поиском по форуму:
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
17.09.2012, 14:29  [ТС]     undefined reference to 'std::basic #20
c:\Program Files\CodeBlocks\MinGW\bin>mingw32-g++.exe -v
Using built-in specs.
Target: mingw32
Configured with: ../../gcc-4.4.1/configure --prefix=/mingw --build=mingw32 --ena
ble-languages=c,ada,c++,fortran,objc,obj-c++ --disable-nls --disable-win32-regis
try --enable-libgomp --enable-cxx-flags='-fno-function-sections -fno-data-sectio
ns' --disable-werror --enable-threads --disable-symvers --enable-version-specifi
c-runtime-libs --enable-fully-dynamic-string --with-pkgversion='TDM-2 mingw32' -
-enable-sjlj-exceptions --with-bugurl=http://www.tdragon.net/recentgcc/bugs.php
Thread model: win32
gcc version 4.4.1 (TDM-2 mingw32)
Yandex
Объявления
17.09.2012, 14:29     undefined reference to 'std::basic
Ответ Создать тему
Опции темы

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