typedef struct _Data
{
int YY;
int XX;
int ZZ;
} DATA, *LPDATA;
//Хочу создать шаблон функции.
template <class type, class name> int MyFun(type t, name n)
{
return t[0].n;
}
//То есть первым параметром указатель на масив структур а вторим имя поля.
//Возможно ли такое?
Возможно ли передать параметром ф-ии имя поля структуры?
Возможно ли передать параметром ф-ии имя поля структуры?
Код:
template< class CLASS, typename TYPE >
TYPE function( CLASS* array, TYPE CLASS::*member )
{[INDENT]return array[0].*member;[/INDENT]}
DATA someData[10];
function( someData, &DATA::YY );
TYPE function( CLASS* array, TYPE CLASS::*member )
{[INDENT]return array[0].*member;[/INDENT]}
DATA someData[10];
function( someData, &DATA::YY );
Код:
TYPE CLASS::*member
//То же самое именно для этого примера можно записать так:
int DATA::* member
//То же самое именно для этого примера можно записать так:
int DATA::* member
По логике можно догадаться что создаеться указатель на тип int структуры DATA.
Но я бы хотел поподробней для себя понять.
Если возможно дайте ссылку на инфу.
Спасибо.
Подробности и другие примеры можно поискать по фразе "Pointer to member". В основном встречаются указатели на методы класса, но если понять их, то указатели на поля класса понять легко ;).
И ещё один вопрос по шаблонах функций.
Ошибка при линковке LNK2001:
Код:
[color=green]//В хеад файле пишу[/color]
[color=green]//tem.h[/color]
[color=blue]#if[/color] ![color=blue]defined[/color](tem_H)
[color=blue]#define[/color] tem_H
[color=blue]template[/color]< [color=blue]class[/color] CLASS, [color=blue]typename[/color] TYPE >
TYPE function( CLASS* array, TYPE CLASS::*member );
[color=blue]#endif[/color]
[color=green]////////////////////////////////////////////////////////////////////////[/color]
[color=green]//tem.cpp[/color]
[color=blue]#include[/color] "struc.h" [color=green]//файл с описанием структуры[/color]
[color=blue]#include[/color] "tem.h"
[color=blue]template[/color]< [color=blue]class[/color] CLASS, [color=blue]typename[/color] TYPE >
TYPE function( CLASS* array, TYPE CLASS::*member )
{
[color=blue]return[/color] array[0].*member;
}
[color=green]////////////////////////////////////////////////////////////////////////////[/color]
[color=green]//Вызываю в my.cpp[/color]
[color=green]//my.cpp[/color]
[color=blue]#include[/color] "struc.h" [color=green]//файл с описанием структуры[/color]
[color=blue]#include[/color] "tem.h"
[color=blue]void[/color] main()
{
DATA someData[10];
function( someData, &DATA::YY );
}
[color=green]//tem.h[/color]
[color=blue]#if[/color] ![color=blue]defined[/color](tem_H)
[color=blue]#define[/color] tem_H
[color=blue]template[/color]< [color=blue]class[/color] CLASS, [color=blue]typename[/color] TYPE >
TYPE function( CLASS* array, TYPE CLASS::*member );
[color=blue]#endif[/color]
[color=green]////////////////////////////////////////////////////////////////////////[/color]
[color=green]//tem.cpp[/color]
[color=blue]#include[/color] "struc.h" [color=green]//файл с описанием структуры[/color]
[color=blue]#include[/color] "tem.h"
[color=blue]template[/color]< [color=blue]class[/color] CLASS, [color=blue]typename[/color] TYPE >
TYPE function( CLASS* array, TYPE CLASS::*member )
{
[color=blue]return[/color] array[0].*member;
}
[color=green]////////////////////////////////////////////////////////////////////////////[/color]
[color=green]//Вызываю в my.cpp[/color]
[color=green]//my.cpp[/color]
[color=blue]#include[/color] "struc.h" [color=green]//файл с описанием структуры[/color]
[color=blue]#include[/color] "tem.h"
[color=blue]void[/color] main()
{
DATA someData[10];
function( someData, &DATA::YY );
}
Когда компилятор встречает вызов шаблонной функции, он пытается найти её определение. Если он его находит, то он инстанциирует шаблон с заданными параметрами, помещает его в текущий модуль и делает ссылку на него.
Если компилятор не находит определение, то он помещает внешнюю сслыку на эту функцию в надежде, что линкеру-то точно повезет. Но линкеру в твоем случае не везет - компилятор не делает инстанциирования необходимого шаблона нигде.
---------------
Если проще, то всегда нужно понимать, что cpp файлы компилируются независимо. А для того, чтобы можно было выполнить шаблонную функцию, надо, чтобы компилятор смог подставить в её реализацию необходимые типы. Тоо. если ты сделаешь реализацию в одном cpp файле, то при компиляции другого компилятор просто не найдет, куда ж эти типы подставить.
Поэтому шаблонные классы/функции объявляются и определяются в заголовочных файлах. Перенеси код из cpp в h.
Кстати, именно из-за этого использование шаблонов часто раздувает размер итогового модуля.
Конечно я уже нашёл что шаблон надо описывать в *.h файлах. :)
А то что шаблон "раздувает" код это я знаю, но по моему лучше описать шаблон чем две функции, так как не известно будет ли она использоваться для иного типа.
А так компилятор сам создаст функции для определённых типов даных.
Или я чот не правильно понял?
Да, всё правильно.:)