LINUX.ORG.RU

export template<class T> .... не работает - кривые руки или дырявая голова?!


0

0

Имеются файлы silly.h, silly.cxx, main.cxx следующего содержания:

// file silly.h

using namespace std;

template<class T> void out(const T& t);

// end of file silly.h


// file silly.cxx

#include <iostream>

#include <string>

#include "silly.h"

export template<class T> void out(const T& t) { cout << "Just the test: \n" << t << "\n"; }

// end of file silly.cxx


// file main.cxx

#include <iostream>

#include <string>

#include "silly.h"


int main()
{
string test("What a fuck is this?!");
out<string>(test);
return 0;
}

// end of file main.cxx

а также есть вот такой простенький Makefile

main: main.o silly.o

g++-3.0 -g $^ -o $@

silly.o: silly.cxx silly.h

g++-3.0 -g -c $< -o $@

main.o: main.cxx silly.h

g++-3.0 -g -c $< -o $@

И вот что из этого всего выходит:

dselect@pc7235b~/coding/silly $make

g++-3.0 -g -c main.cxx -o main.o

g++-3.0 -g -c silly.cxx -o silly.o

g++-3.0 -g main.o silly.o -o main
main.o: In function `std::allocator<char>::~allocator()':
/usr/include/g++-v3/bits/basic_string.tcc(.text+0x6f): undefined reference to `void out<std::string>(std::string const&)'
collect2: ld returned 1 exit status
make: *** [main] Error 1



Внимание, вопрос: что я делаю неправильно?

★★★

вообще для шаблона функции я-бы писал out(test) т.к. параметры шаблона выводятся из параметров функции, но это мне не помогло :(

gcc-3.2.1

anonymous
()

эврика!

grep -r export /build/include:
...
istream:#define export
...
переставляем #include "silly.h" в начало и видим, что:
In file included from main.cxx:1:
silly.h:2: warning: keyword `export' not implemented, and will be ignored

такие дела, не поддерживаются шаблоны в других единицах трансляции,
надо включать везде.

хотя они конечно плохо сделали c `#define export '

да, g++ --version
g++ (GCC) 3.2.1 20020921 (prerelease)
Copyright (C) 2002 Free Software Foundation, Inc.

anonymous
()

а можете мне объяснить. Сейчас взглянул в первый попавшийся драфт стандарта. Там с одной стороны export не значится среди ключевых слов, а с другой упоминается в секции про шаблоны (я сперва вообще думал что export это экстеншен, все таки упоминается). Почему он не ключевое слово тогда??

dilmah ★★★★★
()

Cудя по-всему не идет линковка. Попробуй export перед объявлением поставить, а перед определением убрать.

PETER ★★
()

Не идет линковка.....

2 PETER:

Да я и сам вижу, что она не идет :(. Вопрос - как с этим бороться? В объявлении пробовал писать export - никакого эффекта.

2 dilmah:

Я сейчас взглянул в Страуса - там export значится в списке ключевых слов. Вот только не знаю, реализовано ли оно в g++.

Dselect ★★★
() автор топика

2Dselect: ну я же написал, export не поддерживается g++ :

warning: keyword `export' not implemented, and will be ignored.

в твоем случае g++ его не выдает потому, что в коде он не видит этого export т.к. в стандартных хидерах содержится

#define export

то-сть export заменяется препроцессором на пустое место. можешь сам проверить путем g++ -E silly.cxx

HTH

anonymous
()

Проблема с GCC3.2

Зайдите на gcc.gnu.org - там чётко написано, что функция export ещё не реализована, поэтому надо и объявления и реализацию помещать в заголовочный файл. Можно ещё попробывать сделать так #include "code.cpp"

ASm
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.