[VSExpress 2005] problem z szablonami

0

mam pliki:

modint.h:

class ModInt
{
public:
    ModInt(int v = 0)
    {
        value = v;
        if (modulus)
            value %= modulus;
    }
    ModInt operator + (const ModInt& k) const
    {
        return ModInt(value + k.value);
    }
    ModInt operator - (const ModInt& k) const
    {
        return ModInt(value - k.value);
    }
    ModInt operator * (const ModInt& k) const
    {
        return ModInt(value * k.value);
    }
    bool operator == (const ModInt& k) const
    {
        return value == k.value;
    }
    const ModInt& operator += (const ModInt& k)
    {
        value = (value + k.value);
        if (modulus)
            value %= modulus;
        return *this;
    }
    const ModInt& operator -= (const ModInt& k)
    {
        value = (value - k.value);
        if (modulus)
            value %= modulus;
        return *this;
    }
    const ModInt& operator *= (const ModInt& k)
    {
        value = (value * k.value);
        if (modulus)
            value %= modulus;
        return *this;
    }
    const ModInt& operator = (const ModInt& k)
    {
        value = k.value;
        return *this;
    }
    const ModInt& operator = (int v)
    {
        value = v;
        if (modulus)
            value %= modulus;
        return *this;
    }
    operator int()
    {
        return this->value;
    }
protected:
    int   value;
    static int modulus;
};

modint.cpp:

#include "ModInt.h"

int ModInt::modulus = 0;

klocek.h:

#pragma once

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

template<class T, int N>
class Klocek
{
public:
    bool        operator == (const Klocek& k);
    const Klocek&   operator += (const Klocek& k);
    Klocek      operator + (const Klocek& k) const;
    const Klocek&   operator -= (const Klocek& k);
    Klocek      operator - (const Klocek& k) const;
    void        WczytajZPliku(fstream& file);
    T At(int n, int k);
    T Diff(const Klocek& k) const;

private:
    T   m_cells[N][N];
};

klocek.cpp:

#include "Klocek.h"

template<class T, int N>
bool        Klocek<T, N>::operator == (const Klocek& k)
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            if (m_cells[i][j] != k.m_cells[i][j])
                return FALSE;
    return TRUE;
}

template<class T, int N>
const Klocek<T, N>& Klocek<T, N>::operator += (const Klocek& k)
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            m_cells[i][j] += k.m_cells[i][j];
    return *this;
}

template<class T, int N>
Klocek<T, N>        Klocek<T, N>::operator + (const Klocek& k) const
{
    Klocek& result = new Klocek();
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            result.m_cells[i][j] = m_cells[i][j] + k.m_cells[i][j];
    return result;
}

template<class T, int N>
const Klocek<T, N>& Klocek<T, N>::operator -= (const Klocek& k)
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            m_cells[i][j] -= k.m_cells[i][j];
    return *this;
}

template<class T, int N>
Klocek<T, N>        Klocek<T, N>::operator - (const Klocek& k) const
{
    Klocek& result = new Klocek();
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            result.m_cells[i][j] = m_cells[i][j] - k.m_cells[i][j];
    return result;
}

template<class T, int N>
void        Klocek<T, N>::WczytajZPliku(fstream& file)
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            file >> m_cells[i][j];
}

template<class T, int N>
T       Klocek<T, N>::At(int n, int k)
{
    return m_cells[i][j];
}

template<class T, int N>
T Klocek<T, N>::Diff(const Klocek& k) const
{
    T v(0);
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            v += m_cells[i][j] - k.m_cells[i][j];
    return v;
}

i teraz zaczynam robić szablon klocki.

akutalny wygląd klocki.h:

#pragma once

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>

#include "Klocek.h"

using namespace std;

template<template<Klocek<typename, int>> typename C<T, N>>
class Klocki
{
public:
    void        WczytajZPliku(fstream& file);
    C   operator[] (int n);
    int size();

private:
    vector<C>   m_boxes;
};

klocki ma zawierać wektor złożony z klocek<T, N>. linia:

template<template<Klocek<typename, int>> typename C<T, N>>

z pewnością jest zła. czy ktoś wie jak poprawnie zadeklarować klasę klocki?

0

albo tak:

class Klocki
{
public:
    ....

private:
    vector<Klocek<PAR1, PAR2>>  m_boxes;
    //PARx sa do uzupelnienia, tzreba podac parametry klockow..
};

albo tak:

template<class T, int N>
class Klocki
{
public:
    ....

private:
    vector<Klocek<T, N>>  m_boxes;
};

albo jeszcez pare inncyh mozliwosci, ale sadze ze ta druga wystarczy

0

a dokładnie jak tą pierwszą metodę zastosować? tzn. gdzie podać par1 i par2?

0

no kurcze.. po prostu wpisac argumenty template'a zamiast owych PAR1 i PAR2.. tak jak masz np. vector< double >, to trzeba dac parametr klockowi, np. Klocek< costam, 5 >.. czyli tutaj vector klockow - vector < Klocek < costam, 5> >

0

zrobiłem tym drugim sposobem.

mam już wszystko prawie do kupy poskładane, ale linker się pluje. wywala:

------ Build started: Project: Klocki, Configuration: Debug Win32 ------
Compiling...
Projekt.cpp
Linking...
Projekt.obj : error LNK2019: unresolved external symbol "public: void thiscall Wstawiacz<class ModInt,5>::WypiszRoznice(void)" ([email protected][email protected]@@[email protected]@QAEXXZ) referenced in function _main
Projekt.obj : error LNK2019: unresolved external symbol "public: void __thiscall Wstawiacz<class ModInt,5>::Wstawiaj(void)" ([email protected][email protected]@@[email protected]@QAEXXZ) referenced in function _main
Projekt.obj : error LNK2019: unresolved external symbol "public: void
thiscall Wstawiacz<class ModInt,5>::WczytajWstawienia(class std::basic_ifstream<char,struct std::char_traits<char> > &)" ([email protected][email protected]@@[email protected]@[email protected][email protected]@[email protected]@@[email protected]@@Z) referenced in function _main
Projekt.obj : error LNK2019: unresolved external symbol "public: void __thiscall Wstawiacz<class ModInt,5>::WczytajWypelnienie(class std::basic_ifstream<char,struct std::char_traits<char> > &)" ([email protected][email protected]@@[email protected]@[email protected][email protected]@[email protected]@@[email protected]@@Z) referenced in function _main
Projekt.obj : error LNK2019: unresolved external symbol "public: void __thiscall Wstawiacz<class ModInt,5>::WczytajKlocki(class std::basic_ifstream<char,struct std::char_traits<char> > &)" ([email protected][email protected]@@[email protected]@[email protected][email protected]@[email protected]@@[email protected]@@Z) referenced in function _main
C:\Documents and Settings\Fighter\Pulpit\Klocki\Debug\Klocki.exe : fatal error LNK1120: 5 unresolved externals
Build log was saved at "file://c:\Documents and Settings\Fighter\Pulpit\Klocki\Klocki\Debug\BuildLog.htm"
Klocki - 6 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

projekt zzipowany jest tu:
http://www.mytempdir.com/1339603

0

nie ma co sciagac.. po logu widac ze kompilacja jest 100% ok, a blad przy linkowaniu dopiero. a wiec najwyrazniej albo nie zaiplementowales tych funkcji i istnieja jedynie ich definicje w .h, albo tez zapomniales pliku .cpp z ich implementacja dolaczyc do projektu

0

ok, już sobie jakoś poradziłem. wkleiłem definicje (ciała) wszystkich funkcji do plików .h i działa.

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