Templates

Discussion in 'C++' started by Puvendran, Nov 6, 2003.

  1. Puvendran

    Puvendran Guest

    Hi,

    I am writing a simple program to use templates. Basically the program
    should be able create a stack of any type with ultimately 2 methods
    one to add (push) and one to remove (pop) from the stack.

    I am getting a compilation error thus - it's the stack<int>
    s(10)declaration which seems to be the problem


    Undefined first referenced
    symbol in file
    stack<int>::stack(int) /var/tmp/ccdiGgf1.o
    ld: fatal: Symbol referencing errors. No output written to p
    collect2: ld returned 1 exit status

    Programs involved :


    The main prog is

    #include "p_stack.h"
    //#include <iostream.h>

    void
    main()
    {
    stack<int> s(10);

    int i;

    for (int j=0;j < 12; j++)
    {
    //s.push(j);

    }

    for (int j=0;j < 10; j++)
    {
    //cout << s.pop() << endl;
    }

    }

    The "p_stack.h" is

    #include <vector>

    template<class T>
    class stack
    {
    public :

    //int max_size;
    //int curr_size;
    vector<T> v;

    stack(int);

    //void push(T);
    //T pop();
    };

    p_stack.cc is

    #include "p_stack.h"
    #include <string>

    template<class T>
    stack<T>::stack(int i)
    {
    v.resize(i);
    }


    I thank you in advance for any assistance.

    Puvendran
     
    Puvendran, Nov 6, 2003
    #1
    1. Advertising

  2. Puvendran

    DarkSpy Guest

    5 Nov 2003 22:54:18 -0800
    (Puvendran)

    >Hi,
    >
    >I am writing a simple program to use templates. Basically the program
    >should be able create a stack of any type with ultimately 2 methods
    >one to add (push) and one to remove (pop) from the stack.
    >
    >I am getting a compilation error thus - it's the stack<int>
    >s(10)declaration which seems to be the problem
    >
    >
    >Undefined first referenced
    > symbol in file
    >stack<int>::stack(int) /var/tmp/ccdiGgf1.o
    >ld: fatal: Symbol referencing errors. No output written to p
    >collect2: ld returned 1 exit status
    >
    >Programs involved :
    >
    >
    >The main prog is
    >
    >#include "p_stack.h"
    >//#include <iostream.h>
    >
    >void
    >main()
    >{
    > stack<int> s(10);
    >
    > int i;
    >
    > for (int j=0;j < 12; j++)
    > {
    > //s.push(j);
    >
    > }
    >
    > for (int j=0;j < 10; j++)
    > {
    > //cout << s.pop() << endl;
    > }
    >
    >}

    C++ standard:
    int main() or main() will return a int value implicit.


    >The "p_stack.h" is
    >
    >#include <vector>
    >
    >template<class T>
    >class stack
    >{
    > public :
    >
    > //int max_size;
    > //int curr_size;
    > vector<T> v;


    that is std::vector<T>
    or define
    using namespace std;
    or define
    using std::vector

    to tell compiler the vector is defined with namespace std.


    > stack(int);
    >
    > //void push(T);
    > //T pop();
    >};
    >
    >p_stack.cc is
    >
    >#include "p_stack.h"
    >#include <string>
    >
    >template<class T>
    >stack<T>::stack(int i)
    >{
    > v.resize(i);
    >}
    >
    >
    >I thank you in advance for any assistance.
    >
    >Puvendran






    [comp.lang.c++]
    [comp.lang.c++.moderated]
    DarkSpy, A C++ Mad Dog. :)
     
    DarkSpy, Nov 6, 2003
    #2
    1. Advertising

  3. Puvendran

    Oplec Guest

    Puvendran wrote:
    > Hi,
    >
    > I am writing a simple program to use templates. Basically the program
    > should be able create a stack of any type with ultimately 2 methods
    > one to add (push) and one to remove (pop) from the stack.
    >
    > I am getting a compilation error thus - it's the stack<int>
    > s(10)declaration which seems to be the problem
    >
    >
    > Undefined first referenced
    > symbol in file
    > stack<int>::stack(int) /var/tmp/ccdiGgf1.o
    > ld: fatal: Symbol referencing errors. No output written to p
    > collect2: ld returned 1 exit status
    >
    > Programs involved :
    >
    >
    > The main prog is
    >
    > #include "p_stack.h"
    > //#include <iostream.h>
    >
    > void
    > main()
    > {
    > stack<int> s(10);
    >
    > int i;
    >
    > for (int j=0;j < 12; j++)
    > {
    > //s.push(j);
    >
    > }
    >
    > for (int j=0;j < 10; j++)
    > {
    > //cout << s.pop() << endl;
    > }
    >
    > }
    >
    > The "p_stack.h" is
    >
    > #include <vector>
    >
    > template<class T>
    > class stack
    > {
    > public :
    >
    > //int max_size;
    > //int curr_size;
    > vector<T> v;
    >
    > stack(int);
    >
    > //void push(T);
    > //T pop();
    > };
    >
    > p_stack.cc is
    >
    > #include "p_stack.h"
    > #include <string>
    >
    > template<class T>
    > stack<T>::stack(int i)
    > {
    > v.resize(i);
    > }
    >
    >
    > I thank you in advance for any assistance.
    >
    > Puvendran


    If your compiler does not support the C++ "export" feature for
    templates, and most compilers do not, then you must include you class
    template member definitions after your class template definition in
    every .cc file that will use your class template. What that means is
    that you need to copy the member definition from p_stack.cc to p_stack.h
    and make sure that the member definition is placed after the template
    definition.

    You should have this for p_stack.h

    #ifndef P_STACK_H
    #define P_STACK_H

    #include <vector>

    template<class T>
    class stack
    {
    public :

    //int max_size;
    //int curr_size;
    vector<T> v;

    stack(int);

    //void push(T);
    //T pop();
    };

    template<class T>
    stack<T>::stack(int i)
    {
    v.resize(i);
    }

    #endif // #ifndef P_STACK_H
     
    Oplec, Nov 6, 2003
    #3
  4. Puvendran

    Gavin Deane Guest

    (Puvendran) wrote in message news:<>...
    > Hi,
    >
    > I am writing a simple program to use templates. Basically the program
    > should be able create a stack of any type with ultimately 2 methods
    > one to add (push) and one to remove (pop) from the stack.
    >
    > I am getting a compilation error thus - it's the stack<int>
    > s(10)declaration which seems to be the problem
    >
    >
    > Undefined first referenced
    > symbol in file
    > stack<int>::stack(int) /var/tmp/ccdiGgf1.o
    > ld: fatal: Symbol referencing errors. No output written to p
    > collect2: ld returned 1 exit status


    <code snipped>

    See http://www.comeaucomputing.com/techtalk/templates/#whylinkerror

    Either use the export keyword when defining the stack constructor if
    your compiler supports export, or put #include "p_stack.cc" at the end
    of p_stack.h. If you do that, make sure that p_stack.cc _does not_
    include p_stack.h.

    hth
    GJD
     
    Gavin Deane, Nov 6, 2003
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Fred
    Replies:
    1
    Views:
    628
    Neredbojias
    Sep 26, 2005
  2. John Harrison

    using templates in templates

    John Harrison, Jul 31, 2003, in forum: C++
    Replies:
    8
    Views:
    398
    Torsten Curdt
    Jul 31, 2003
  3. JKop
    Replies:
    3
    Views:
    505
  4. Tom McCallum

    Templates within templates

    Tom McCallum, Aug 4, 2004, in forum: C++
    Replies:
    2
    Views:
    378
    tom_usenet
    Aug 4, 2004
  5. recover
    Replies:
    2
    Views:
    844
    recover
    Jul 25, 2006
Loading...

Share This Page