Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Szablon klasy dziedziczący po innym szablonie - jak ma wyglądać operator << oraz konstruktor?

Ostatnio zmodyfikowano 2014-02-03 14:48
Autor Wiadomość
debilek
Temat założony przez niniejszego użytkownika
Szablon klasy dziedziczący po innym szablonie - jak ma wyglądać operator << oraz konstruktor?
» 2014-02-01 13:21:43
witam
mam takie coś:
C/C++
#ifndef __TEST__
#define __TEST__

#include <iostream>
using namespace std;

template < template < typename T > class X, typename U >
class kaka
{
private:
    template < typename any >
    class test
    {
    private:
        any * x;
    public:
        test() { };
        test( int rozmiar ) { x = new any[ rozmiar ]; };
        ~test() { delete[] x; };
       
        any & operator []( int i ) { return x[ i ]; };
    };
   
    test < U > zm1;
    X < U > zm2;
   
    int m_rozmiar_array;
    int m_rozmiar_valarray;
public:
    kaka();
    kaka( int rozmiar_array, int rozmiar_valarray )
        : zm1( rozmiar_array )
        , zm2( rozmiar_valarray )
    { m_rozmiar_array = rozmiar_array; m_rozmiar_valarray = rozmiar_valarray; };
   
    void show( void );
    void wypelnij( U zmienna );
};
template < template < typename T > class X, typename U >
void kaka < X, U >::show( void )
{
    for( int i = 0; i < m_rozmiar_array; i++ )
         cout << "zm1[i]: " << zm1[ i ] << endl;
   
    cout << endl << endl;
   
    for( int i = 0; i < m_rozmiar_valarray; i++ )
         cout << "zm2[i]: " << zm2[ i ] << endl;
   
}
template < template < typename T > class X, typename U >
void kaka < X, U >::wypelnij( U zmienna )
{
    for( int i = 0; i < m_rozmiar_array; i++ )
         zm1[ i ] = zmienna;
   
    for( int i = 0; i < m_rozmiar_valarray; i++ )
         zm2[ i ] = zmienna;
   
}

//----------------------------------------------------

template < typename any, template < typename T > class X, typename U >
class bigos;

//template <typename any>
//ostream & operator<<(ostream & os, bigos <typename any, template <typename T>  class X, typename U> & x);


template < typename any, template < typename T > class X, typename U >
class bigos
    : public kaka < X
    , U >
{
private:
    any zmienna1;
public:
    bigos() { };
    bigos( any zm, int array, int val_array )
        : kaka < X
        , U >( array, val_array )
    { zmienna1 = zm; };
   
    // friend template <typename any> ostream & operator<< <>(ostream & os, bigos<typename any, template <typename T> class X, typename U> & x);
   
   
};
#endif

oraz main
C/C++
#include <iostream>
#include <valarray>
#include "test.h"

int main()
{
    kaka < std::valarray, int > zm1( 10, 10 );
    bigos < int, std::valarray, int > zm2( 5, 10, 10 );
   
    zm1.wypelnij( 10 );
   
    zm1.show();
   
    bigos < int, std::valarray, int > test;
   
    return 0;
}

ta linijka bigos<int, std::valarray, int> test; kiedy jest za komentowana wszystko się kompiluje. a jak nie to mam taki błąd
main.cpp:(.text$_ZN5bigosIiSt8valarrayiEC1Ev[_ZN5bigosIiSt8valarrayiEC1Ev]+0x14): undefined reference to `kaka<std::valarray, int>::kaka()'

następnie próba przeciążenia operatora << kiedy ją od komentuje mam taki błąd
[Error] wrong number of template arguments (1, should be 3)

i nierozumień jednej rzeczy, jak wiadomo konstruktor klasy pochodenej musi wywołać konstruktor klasy bazowej. Ale dlaczego tutaj muszę napisać kaka<X, U> a nie samo kaka

proszę o pomoc
P-103747
DejaVu
» 2014-02-03 14:48:01
C/C++
bigos( any zm, int array, int val_array )
    : kaka < X
    , U >( array, val_array )
{ zmienna1 = zm; };
Zamień na:
C/C++
bigos( any zm, int array, int val_array )
    : kaka( array, val_array )
{ zmienna1 = zm; };

PS. Podaj inną nazwę konta na jaką ma zostać ono zmienione jeżeli nie chcesz, aby zostało ono usunięte.
P-103918
« 1 »
  Strona 1 z 1