# [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
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.