Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Линковка статических полей и методов шаблона, не линкуется, иногда даже не компилится) 
:(
    Опции темы
scai
Дата 18.4.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Неофит
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.1.2007
Где: г. Загорск

Репутация: нет
Всего: 2



В общем, тема такая, шаблон контейнера a la матрица, позволяющий работать со строками => класс для строки, класс самого контейнера, включающий массив этих самых строк. Соответственно конструктор, принимающий длину и ширину матрицы. Т.к. new type[size](init_values) заблаговременно запрещена дизайнерами языка, единственное что придумалось, это статическое поле в классе строки, из которого дефолтный конструктор берет размер. Началось, примерно, со следующего:
Код

#include <iostream>
template<class t> class Unit{
public:
    static int dft;/* size by default */
    t* _data;/* THE array */
    const int _size;

    Unit():_size(dft){/* default constructor*/
        _data = new t[_size]();
    }

    static void setDft(int i_dft);
};

template<class t> static void Unit<t>::/**/setDft(int i_dft){
    dft = i_dft;
}


template<class t> class Holder{
    Holder();
public:
    const int _size;
    Unit<t>* _units;/* THE array*/

    Holder(int i_h_size, int i_u_size): _size(i_h_size){

        Unit<t>::setDft(i_u_size);/* Unit initialization */

        _units = new Unit<t>[_size]();
    }
};

int main(){
    Holder<int> i(10,10);
    return 0;
}


static_methods_in_template_defered_declaration.cpp:15: error: cannot declare member function 'static void Unit<t>::setDft(int)' to have static linkage
было мне ответом от gcc( gnu g++  и  djgpp)

Код

#include <iostream>
template<class t> class Unit{
public:
    static int dft;
    t* _data;
    const int _size;

    Unit():_size(dft){
        _data = new t[_size]();
    }

    static void setDft(int i_dft){/* вот единственное изменение. определено на месте */
        dft = i_dft;
    }
};

template<class t> class Holder{
    Holder();
public:
    const int _size;
    Unit<t>* _units;
    Holder(int i_h_size, int i_u_size): _size(i_h_size){
        Unit<t>::setDft(i_u_size);
        _units = new Unit<t>[_size]();
    }
};

int main(){
    Holder<int> i(10,10);
    return 0;
}

c:/djgpp/tmp/cctD7dTT.o:static_methods_in_template.cpp:(.gnu.linkonce.t._ZN4UnitIiE6setDftEi+0x7): undefined reference to `Unit<int>::dft'
c:/djgpp/tmp/cctD7dTT.o:static_methods_in_template.cpp:(.gnu.linkonce.t._ZN4UnitIiEC1Ev+0x8): undefined reference to `Unit<int>::dft'
collect2: ld returned 1 exit status

то есть, все таки скомпилилось, а в чем принципиальная разница?
[upd] вспомнил. за g++ далеко лезть, если примерно: он говорил про андефайнд еференс на  Unit<int>::setDft(int)

и для полноты картины, без функции-инициализатора, напрямую:
Код

#include <iostream>
template<class t> class Unit{
public:
    static int dft;
    t* _data;
    const int _size;

    Unit():_size(Unit<t>::dft){
        _data = new t[_size]();
    }

};

template<class t> class Holder{
    Holder();
public:
    const int _size;
    Unit<t>* _units;
    Holder(int i_h_size, int i_u_size): _size(i_h_size){

        Unit<t>::dft = i_u_size; /* direct init */

        _units = new Unit<t>[_size]();
    }
};

int main(){
    Holder<int> i(10,10);
    return 0;
}


c:/djgpp/tmp/ccJ0PuHf.o:static_fiels_in_template.cpp:(.gnu.linkonce.t._ZN4UnitIiEC1Ev+0x8): undefined reference to `Unit<int>::dft'
c:/djgpp/tmp/ccJ0PuHf.o:static_fiels_in_template.cpp:(.gnu.linkonce.t._ZN6HolderIiEC1Eii+0x13): undefined reference to `Unit<int>::dft'
collect2: ld returned 1 exit status

вооот. есть мысли у кого-нибудь?


[upd] возможно, я сыдиотничал   smile 

Это сообщение отредактировал(а) scai - 18.4.2008, 19:09
--------------------
 
PM MAIL   Вверх
Daevaorn
Дата 18.4.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Цитата(scai @  18.4.2008,  19:59 Найти цитируемый пост)
вооот. есть мысли у кого-нибудь?

Мысль одна, чтобы вы нормально сформулировали вопрос и отделили зерна от плевел.
PM MAIL WWW   Вверх
scai
Дата 18.4.2008, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Неофит
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.1.2007
Где: г. Загорск

Репутация: нет
Всего: 2



Тысяча поклонов, владыка регистров и PCI-шины.
Судя по сообщениям с фронта, статические члены шаблона класса до  .о-файлов, почему-то, не добираются. Индуктивная  же разведка сообщает, что если определить статический метод вне тела класса, то эти .о-файлы невозможно даже скомпилировать (cannot declare member function 'static void Unit<t>::setDft(int)' to have static linkage). Подробности см. выше.
Вопрос1: чего я не знаю о статических членах?
Вопрос2(основной): как собрать шаблон класса для матрицы, конструктор которого принимает ширину и высоту, и состоящий из отдельных объектов-строк?


Это сообщение отредактировал(а) scai - 18.4.2008, 22:49
--------------------
 
PM MAIL   Вверх
JackYF
Дата 18.4.2008, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Другим компилятором пробовал?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
scai
Дата 19.4.2008, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Неофит
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.1.2007
Где: г. Загорск

Репутация: нет
Всего: 2



а что мне другой компилятор, мне под Xlib писать...

Добавлено @ 09:59
 smile сейчас попробую, ...
Посмотрите кто-нить, тут кода кот наплакал. Ляпнул можт чего?

Больше всего удивляет, что компилятор ведет себя по-разному, в зависимости от того, где именно функция определяется..... 

Это сообщение отредактировал(а) scai - 19.4.2008, 10:07
--------------------
 
PM MAIL   Вверх
scai
Дата 19.4.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Неофит
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.1.2007
Где: г. Загорск

Репутация: нет
Всего: 2



Цитата

R.14.8 Статические члены и переменные
Для каждого шаблонного класса или функции, создаваемых по шаблону
типа, образуется своя копия статических переменных или членов.
Рассмотрим пример:

          
Код

template<class T> class X {
       static T s;
      // ...
};

X<int> aa;
X<char*> bb;


Здесь в классе X<int> есть статический член типа int, а в классе
X<char> есть статический член типа char*.



и ничего больше. То есть, никаких, вроде бы, ограничений...

ааа. вот:ANSI'97-draft:
Цитата

The implicit instantiation of a class  template specialization does not cause the implicit  instantiation  of
  the  definitions of the class member functions, member classes, static  data members or member templates. 


Что бы это значило? Не могу перевести, но буквы знакомые. 


Вот это explicit&inplicit instatniation&specialization, в контексте срр что может значить,  подскажите 

да.. devc++ говорит то же самое и теми же словами. перегружусь, посмотрю можт там еще какие компиляторы водятся....

[upd] не водятся... ... ... ))))

Это сообщение отредактировал(а) scai - 19.4.2008, 13:29
--------------------
 
PM MAIL   Вверх
scai
Дата 19.4.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Неофит
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.1.2007
Где: г. Загорск

Репутация: нет
Всего: 2



В конкретном случае, сделаю массив указателей на строку и сборочно-разборочный цикл... хм... так оно, в общем-то, и нужно..

почему этот код нормально не компилится-то?


--------------------
 
PM MAIL   Вверх
bsa
Дата 19.4.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



scai, рекомендую использовать наследование, если тебе так нужен эта статическая переменная:
Код
struct UnitAttr
{
     static int dft;
     static void setDft(int i_dft) {dft = i_dft; }
};

template<class T>
class Unit : private UnitAttr
{
public:
    using UnitAttr::setDft;
...
};
Код не компилируется, так как ты должен определить статическую переменную только один раз для все программы. Но, так как ты делаешь шаблон, то тебе нужно для каждой специализации ее определять, но единожды. Красиво это сделать довольно проблематично. Один из способов я продемонстрировал.
PM   Вверх
scai
Дата 19.4.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Неофит
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.1.2007
Где: г. Загорск

Репутация: нет
Всего: 2



Все равно 
Код

c:/djgpp/tmp/ccNwM2rc.o:Untitled1.cpp:(.gnu.linkonce.t._ZN8UnitAttr6setDftEi+0x7): undefined reference to `UnitAttr::dft
c:/djgpp/tmp/ccNwM2rc.o:Untitled1.cpp:(.gnu.linkonce.t._ZN4UnitIiEC1Ev+0x17): undefined reference to `UnitAttr::dft'


Цитата(bsa @  19.4.2008,  17:10 Найти цитируемый пост)
если тебе так нужен эта статическая переменная


свою задачу я и без нее решил, но дело принципа
bsa, я в теории слаб, но специализация, это, вроде Unit<int>, то есть... что-то наподобие
Код

template<class T> class Unit {
....

template<class int> class Unit {
   static int...

что ли?

определять статические члены для каждой специализации ... посредством наследования .... using ... пойду отцов почитаю.

Это сообщение отредактировал(а) scai - 19.4.2008, 20:21
--------------------
 
PM MAIL   Вверх
Dennnis
Дата 19.4.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: 1
Всего: 4



Код

template<class T> class Unit {
....
template<> class Unit<int> {
   static int...

--------------------
Get Rich or Die Tryin'
PM   Вверх
bsa
Дата 20.4.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(scai @ 19.4.2008,  20:09)
Все равно 
Код

c:/djgpp/tmp/ccNwM2rc.o:Untitled1.cpp:(.gnu.linkonce.t._ZN8UnitAttr6setDftEi+0x7): undefined reference to `UnitAttr::dft
c:/djgpp/tmp/ccNwM2rc.o:Untitled1.cpp:(.gnu.linkonce.t._ZN4UnitIiEC1Ev+0x17): undefined reference to `UnitAttr::dft'

Вообще-то предполагалось, что существует файл unitattr.cpp, в котором определен статический атрибут dft. Без этого никак.
PM   Вверх
archimed7592
Дата 28.4.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Код

template< class T >
class C
{
    static int i;
    static void foo();
};

template< class T >
int C< T >::i = 50;

template< class T >
void C< T >::foo()
{ /* ... */ }
scai, так компилируется? Ошибку я у тебя в коде вижу, но, надеюсь, после этого примера, ты найдёшь её сам smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.