Archief - C++ vector van't type template

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

ForzaMantis

Legacy Member
Set.h
Code:
#pragma once
#include <vector>

using namespace std;

template< typename T>

class Set
{
public:
	Set();
	~Set();

	bool insert(const T &);
	static vector< T > train;
};

TestSet.cpp
Code:
#include "stdafx.h"
#include "Set.h"
#include <vector>
//#include <iostream>

using namespace std;

template< typename T>
bool insert(const T & value){
	Set<T>::train.push_back (value);
	return true;
}

int main()
{
	insert("2") ;
	return 0;
}

Ik kan je zeggen zonder overdrijven dat ik al 6 uur dit stuk code probeer te doen werken. Het is de bedoeling dat ik een globale vector heb van het type "template", die ik dan in verschillende functies in de main (TestSet.cpp) kan gebruiken.

Tyfius

Legacy Member
Bon, een beetje complexe code introduceren. Ik heb lang, lang geleden ook eens zoiets nodig gehad (de code staat al sinds 2007 op mijn telenet webspace, maar ik heb het sindsdien niet meer gebruikt :p) en na veel vijven en zessen ben ik toen op het volgende uitgekomen:

Code:
#ifndef STACK_H
#define STACK_H

#include <deque>
#include <stdexcept>
#include <memory>

template <typename T,
          template <typename ELEM, 
                    typename = std::allocator<ELEM> >
                    class CONT = std::deque>
class Stack {
  private:
    CONT<T> elems;         // elements

  public:
    void push(T const&);   // push element
    void pop();            // pop element
    T top() const;         // return top element
    bool empty() const {   // return whether the stack is empty
        return elems.empty();
    }

    // assign stack of elements of type T2
    template<typename T2, 
             template<typename ELEM2, 
                      typename = std::allocator<ELEM2>
                     >class CONT2>
    Stack<T,CONT>& operator= (Stack<T2,CONT2> const&);
};

template <typename T, template <typename,typename> class CONT>
void Stack<T,CONT>::push (T const& elem)
{
    elems.push_back(elem);    // append copy of passed elem
}

template<typename T, template <typename,typename> class CONT>
void Stack<T,CONT>::pop ()
{
    if (elems.empty()) {
        throw std::out_of_range("Stack<>::pop(): empty stack");
    }
    elems.pop_back();         // remove last element
}

template <typename T, template <typename,typename> class CONT>
T Stack<T,CONT>::top () const
{
    if (elems.empty()) {
        throw std::out_of_range("Stack<>::top(): empty stack");
    }
    return elems.back();      // return copy of last element
}

template <typename T, template <typename,typename> class CONT>
 template <typename T2, template <typename,typename> class CONT2>
Stack<T,CONT>&
Stack<T,CONT>::operator= (Stack<T2,CONT2> const& op2)
{
    if ((void*)this == (void*)&op2) {    // assignment to itself?
        return *this;
    }

    Stack<T2,CONT2> tmp(op2);        // create a copy of the assigned stack

    elems.clear();                   // remove existing elements
    while (!tmp.empty()) {           // copy all elements
        elems.push_front(tmp.top());
        tmp.pop();
    }
    return *this;
}

#endif

Dat doet dus wat jij wil, het enige verschil is dat ik standaard een std::deque gebruik in plaats van een std::vector. Maar dat kan je natuurlijk naar goeddunken veranderen.

In gebruik kan je dan iets doen als het volgende:
Code:
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include "stack.h"

int main()
{
    try {
        Stack<int>   intStack;       // stack of ints
        Stack<float> floatStack;     // stack of floats

        // manipulate int stack
        intStack.push(42);
        intStack.push(7);

        // manipulate float stack
        floatStack.push(7.7);

        // assign stacks of different type
        floatStack = intStack;

        // print float stack
        std::cout << floatStack.top() << std::endl;
        floatStack.pop();
        std::cout << floatStack.top() << std::endl;
        floatStack.pop();
        std::cout << floatStack.top() << std::endl;
        floatStack.pop();
    }
    catch (std::exception const& ex) {
        std::cerr << "Exception: " << ex.what() << std::endl;
    }

    // stack for ints using a vector as an internal container
    Stack<int,std::vector> vStack;
    vStack.push(42);
    vStack.push(7);
    std::cout << vStack.top() << std::endl;
    vStack.pop();
}

Zoals je hier onderaan kan zien kan je het type container aanpassen.
Code:
// stack for ints using a vector as an internal container
Stack<int,std::vector> vStack;

ForzaMantis

Legacy Member
Dankjewel. Mijn fout is dus dat in mijn functies specificeer in de .cpp file in plaats van de .h file. Ik heb het ondertussen werkende gekregen. Nogmaals, merci.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan