Szablon funkcji - problem

0

Witam

Napisałem szablon prostej funkcji do szybkiego tworzenia tablicy dwuwymiarowej na stercie( w postaci wskaźnika do tablicy wskaźników).

Nagłówek;


#ifndef 2D_TABLE_H_INCLUDED
#define 2D_TABLE_H_INCLUDED

template<typename T>
T** make_2dtable(int l,int c )
{
T**t=new T*[l];
int i;
for(i=0;i<l;++i)
t[i]=new T[c];
return t;
}

template<typename T>
T** make_2dtable(int l,int c,const T& val )
{
T**t=new T*[l];
int i,j;
for(i=0;i<l;++i)
t[i]=new T[c];
for(i=0;i<l;++i)
for(j=0;j<c;++j)
t[i][j]=val;
return t;
}

#endif // 2D_TABLE_H_INCLUDED

Test w main

#include "2d_table.h"

int main()
{
int**t1=make_2dtable(10,10,0); //ma zwrócic wskaznik do tablicy 10x10 wypelnionej zerami
int**t2=make_2dtable<int>(10,10) //wskaźnik do niezainicjalizowanej zadnymi wartosciami tablicy
return 0;
}

Nie chce się skompilować. Czepia się nagłówka podając błąd -macro names must be identifiers
W czym kompilator widzi problem :-O. Ide jakie używam to od dziś code::block wcześniej dev. W obydwóch to samo.

0

wstaw typename przed T tam gdzie definiujesz zmienne tego typu.

0

Już doszedłem do przyczyny,która tkwi w nazwie po dyrektywie #ifndef. Bardzo dziwne ale okazuje się,że pierwszym znakiem w tej nazwie nie może być cyfra bo z niezrozumiałych dla mnie powodów stwarza to problemy dla preprocesora albo kompilatora.
Poprawiony i działający szablon. Taki bzdet ale może się komuś przyda.

 #ifndef TABLE_2D_H_INCLUDED
#define TABLE_2D_H_INCLUDED

template <typename T>
T** make_2dtable(int l,int c )
{
 T**t=new T*[l];
 int i;
 for(i=0;i<l;++i)
 t[i]=new T[c];
 return t;
}

template <typename T>
T** make_2dtable(int l,int c,const T& val )
{
T**t=new T*[l];
int i,j;
for(i=0;i<l;++i)
t[i]=new T[c];
for(i=0;i<l;++i)
for(j=0;j<c;++j)
t[i][j]=val;
return t;
}

template <typename T>
void remove_2dtable(int l,T** t )  // l-ilosc wierszy
{
int i;
for(i=0;i<l;++i)
delete []t[i];
delete []t;
}



#endif // TABLE_2D_H_INCLUDED

#include <iostream>
#include "2d_table.h"
#include <string>
int main()
{
int**t1=make_2dtable(10,10,666);  //zwraca wskaznik do tablicy 10x10 wypelnionej liczbami 666
std::string**t2=make_2dtable(10,10,std::string(" is the number of the beast")); //10x10 ze stringami
int**t3=make_2dtable<int>(10,10); //wskaznik do niezainicjalizowanej zadnymi wartosciami tablicy int 10x10
std::cout<<t1[9][9]<<t2[5][5];
remove_2dtable(10,t1);
remove_2dtable(10,t2);
remove_2dtable(10,t3);
std::cin.get();
return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1