[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)" (?WypiszRoznice@?$Wstawiacz@VModInt@@$04@@QAEXXZ) referenced in function _main
Projekt.obj : error LNK2019: unresolved external symbol "public: void __thiscall Wstawiacz<class ModInt,5>::Wstawiaj(void)" (?Wstawiaj@?$Wstawiacz@VModInt@@$04@@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> > &)" (?WczytajWstawienia@?$Wstawiacz@VModInt@@$04@@QAEXAAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@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> > &)" (?WczytajWypelnienie@?$Wstawiacz@VModInt@@$04@@QAEXAAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@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> > &)" (?WczytajKlocki@?$Wstawiacz@VModInt@@$04@@QAEXAAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@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