C++ шаблоны интерфейс и реализация Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

C++ шаблоны интерфейс и реализация

Post by SmileGobo » Mon Jul 11, 2011 12:37 pm

Немного офтоп, но больше не укого спросить
Разбираюсь с шаблонами, сделал шаблон для хэширования по произвольной таблице:

Code: Select all

#ifndef  _TEMPLATE_HASH_H_
#define  _TEMPLATE_HASH_H_
template <int HASH_SIZE, typename HASH_TYPE,typename VALUE_TYPE>
class HashTable{
    private:
    const HASH_TYPE* const table;
    public:
        HashTable(const void* const table_ptr);
        const HASH_TYPE CalcHash(const VALUE_TYPE& val)const;
};

template <int HASH_SIZE, typename HASH_TYPE,typename VALUE_TYPE>
HashTable<HASH_SIZE,HASH_TYPE,VALUE_TYPE>::HashTable(const void* const table_ptr):table((HASH_TYPE*)table_ptr){}

template <int HASH_SIZE, typename HASH_TYPE,typename VALUE_TYPE>
const HASH_TYPE HashTable<HASH_SIZE,HASH_TYPE,VALUE_TYPE>::CalcHash(const VALUE_TYPE& val)const{
    if(val<HASH_SIZE) return table[val];
    else return table[0];
}
#endif
проблема в том, что когда я выношу интерфейс шаблона в *.h файл, а реализацию в *.cpp, в отдельные файлы компилятор ругается на то что
D:\My Projects\PoliTetst\main.cpp|113|instantiated from here|
D:\My Projects\PoliTetst\main.cpp|44|warning: `class TelemetryData<80, 8, ushort, HASH6BIT>' has virtual functions but non-virtual destructor|
D:\My Projects\PoliTetst\main.cpp||In function `int main()':|
D:\My Projects\PoliTetst\main.cpp|108|warning: unused variable 'MAX_VAL'|
obj\Debug\main.o||In function `main':|
D:\My Projects\PoliTetst\main.cpp|111|undefined reference to `HashTable<64, unsigned char, unsigned char>::HashTable(void const*)'|
obj\Debug\main.o||In function `_ZN13TelemetryDataILi80ELi8Et9HashTableILi64EhhEE7SetDataERKtS4_':|
unsigned short)]+0x1e)||undefined reference to `HashTable<64, unsigned char, unsigned char>::HashTable(void const*)'|
)]+0x4a)||undefined reference to `HashTable<64, unsigned char, unsigned char>::CalcHash(unsigned char const&) const'|
||=== Build finished: 3 errors, 2 warnings ===|
а когода весь код в одном хидере все ок

для ясности main()

Code: Select all

#include <iostream>
#include <vector>


#include "HashTemplate.h"
#include <stdlib.h>
#include <time.h>

using namespace std;
typedef unsigned int uint;
typedef unsigned char byte;
typedef unsigned short ushort;
typedef HashTable<64,byte,byte>HASH6BIT;

const byte table[64]={0x1,0x41,0x21,0x61,0x11,0x51,0x31,0x71,0x9,0x49,
0x29,0x69,0x19,0x59,0x39,0x79,0x5,0x45,0x25,0x65
,0x15,0x55,0x35,0x75,0xD,0x4D,0x2D,0x6D,0x1D,
0x5D,0x3D,0x7D,0x3,0x43,0x23,0x63,0x13,0x53,0x33,
0x73,0xB,0x4B,0x2B,0x6B,0x1B,0x5B,0x3B,0x7B,
0x7,0x47,0x27,0x67,0x17,0x57,0x37,0x77,0xF,0x4F,
0x2F,0x6F,0x1F,0x5F,0x3F,0x7F};

int main(){
	//прогнать разными значениями
    srand( time(NULL) );
    const uint MAX_VAL=64;
    HASH6BIT hash(table);
	//какой убогий итератор получился =(
    bool stop=false; 
    for(frame.Rewind();!stop;stop=frame.Next()){
        for(uint i=0;i<80;i++){
            frame.SetData(i,rand()%MAX_VAL);
        }

    }

    return 0;
}
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Re: C++ шаблоны интерфейс и реализация

Post by borr_1 » Mon Jul 11, 2011 12:51 pm

undefined reference??? а ты HashTable.cpp и HashTable.h в проект добавил?
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse

SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Re: C++ шаблоны интерфейс и реализация

Post by SmileGobo » Tue Jul 12, 2011 4:26 am

да добавил конечно

Да вот правильный main файл:

Code: Select all

#include <iostream>
#include <vector>


#include "HashTemplate.h"
#include <stdlib.h>
#include <time.h>

using namespace std;
typedef unsigned int uint;
typedef unsigned char byte;
typedef unsigned short ushort;
typedef HashTable<64,byte,byte>HASH6BIT;

const byte table[64]={0x1,0x41,0x21,0x61,0x11,0x51,0x31,0x71,0x9,0x49,
0x29,0x69,0x19,0x59,0x39,0x79,0x5,0x45,0x25,0x65
,0x15,0x55,0x35,0x75,0xD,0x4D,0x2D,0x6D,0x1D,
0x5D,0x3D,0x7D,0x3,0x43,0x23,0x63,0x13,0x53,0x33,
0x73,0xB,0x4B,0x2B,0x6B,0x1B,0x5B,0x3B,0x7B,
0x7,0x47,0x27,0x67,0x17,0x57,0x37,0x77,0xF,0x4F,
0x2F,0x6F,0x1F,0x5F,0x3F,0x7F};

int main(){
   //прогнать разными значениями
    srand( time(NULL) );
    const uint MAX_VAL=64;
    HASH6BIT hash(table);
   //какой убогий итератор получился =(
  /*  bool stop=false; 
    for(frame.Rewind();!stop;stop=frame.Next()){
        for(uint i=0;i<80;i++){
            frame.SetData(i,rand()%MAX_VAL);
        }

    }
*/
    return 0;
}
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

SteelRat
Experienced Solver
Experienced Solver
Posts: 50
Joined: Tue Sep 08, 2009 4:42 pm
Location: Russia, Obninsk

Re: C++ шаблоны интерфейс и реализация

Post by SteelRat » Tue Jul 12, 2011 6:23 am

Насколько я в курсе шаблоны должны целиком быть в хидере.
Win7/LinuxMint 17, VS2013/C::B, wxWidgets 3.0 x64

SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Re: C++ шаблоны интерфейс и реализация

Post by SmileGobo » Tue Jul 12, 2011 6:41 am

Да у меня такое же подозрение возникло, когда стал смотреть исходники STL. По идее шаблон реализацию "создает" при неспосредственном использовании, т.е. как бы получается реализация находиться в основном коде?
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Re: C++ шаблоны интерфейс и реализация

Post by borr_1 » Tue Jul 12, 2011 6:58 am

Я вчера недопонял вопрос.

http://www.parashift.com/c++-faq-lite/t ... #faq-35.12
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse

SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Re: C++ шаблоны интерфейс и реализация

Post by SmileGobo » Tue Jul 12, 2011 8:06 am

спасибо интересная статья, я правда нихуя не понял, пойду на форум переводчиков :D
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Re: C++ шаблоны интерфейс и реализация

Post by borr_1 » Tue Jul 12, 2011 8:11 am

WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse

SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Re: C++ шаблоны интерфейс и реализация

Post by SmileGobo » Tue Jul 12, 2011 10:00 am

Явное инстанцирование очень замарочно, функции экспорта шаблонов врядли работаю в моем компиляторе (RealView), так что правильней всего шаблон описывать в одном файле. Всем спасибо за помощь! :)
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

Post Reply