link error if template function is defined in non-header file

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Suzanne

    link error if template function is defined in non-header file

    Hi++,

    I get a link error when I try to call a template function that is
    declared in a header file and defined in a non-header file. I do *not*
    get this link error if I define the template function directly in the
    header file, or if the change the function to non-template.

    For example...
    *** Why am I getting a link error for template function f() in the code
    below?

    Thanks!
    Suzanne

    -----------------------------------
    // File: Main.cpp

    #include "Templates. h"

    int main(int argc, char** argv) {
    f<int>(5); // <--link error here
    }
    -----------------------------------
    // File: Templates.h

    #ifndef TEMPLATES_H
    #define TEMPLATES_H

    #ifndef _STD_USING
    #define _STD_USING // Must be #define'd in order to include iostream.h.
    #endif // _STD_USING

    #include <iostream>

    template<class T>
    void f(T n);

    #endif // TEMPLATES_H
    -----------------------------------
    // File: Templates.cpp

    #include "Templates. h"

    template<class T>
    void f(T n) {
    std::cout << "I got an \"n\"!\n";
    }

  • Victor Bazarov

    #2
    Re: link error if template function is defined in non-header file

    "Suzanne" <suzanne_e_voge l@hotmail.com> wrote...[color=blue]
    > I get a link error when I try to call a template function that is
    > declared in a header file and defined in a non-header file. I do *not*
    > get this link error if I define the template function directly in the
    > header file, or if the change the function to non-template.
    >
    > For example...
    > *** Why am I getting a link error for template function f() in the code
    > below?[/color]

    Because the compiler doesn't get a chance to create the correct,
    required, instantiation of the template if it doesn't see the body
    of the function template when compiling the code that uses it.

    Victor


    Comment

    • Chandra Shekhar Kumar

      #3
      Re: link error if template function is defined in non-header file

      coz, compiler can't see the definition of the function f.
      so u shud include the definition of f in the header file, this is the
      practice for all the template functions

      Suzanne wrote:
      [color=blue]
      > Hi++,
      >
      > I get a link error when I try to call a template function that is
      > declared in a header file and defined in a non-header file. I do *not*
      > get this link error if I define the template function directly in the
      > header file, or if the change the function to non-template.
      >
      > For example...
      > *** Why am I getting a link error for template function f() in the code
      > below?
      >
      > Thanks!
      > Suzanne
      >
      > -----------------------------------
      > // File: Main.cpp
      >
      > #include "Templates. h"
      >
      > int main(int argc, char** argv) {
      > f<int>(5); // <--link error here
      > }
      > -----------------------------------
      > // File: Templates.h
      >
      > #ifndef TEMPLATES_H
      > #define TEMPLATES_H
      >
      > #ifndef _STD_USING
      > #define _STD_USING // Must be #define'd in order to include iostream.h.
      > #endif // _STD_USING
      >
      > #include <iostream>
      >
      > template<class T>
      > void f(T n);
      >
      > #endif // TEMPLATES_H
      > -----------------------------------
      > // File: Templates.cpp
      >
      > #include "Templates. h"
      >
      > template<class T>
      > void f(T n) {
      > std::cout << "I got an \"n\"!\n";
      > }[/color]

      Comment

      • Patrick Kowalzick

        #4
        Re: link error if template function is defined in non-header file

        Hi Suzanne,

        Template functions are only created if you "use" them. Nothing is happening
        if you do not create an instance of a special type. Anyway, how should this
        be possible?
        This is exactly the case when your compiler creates the object file of your
        cpp. So you have an object file with nothing inside.

        Patrick

        "Suzanne" <suzanne_e_voge l@hotmail.com> wrote in message
        news:3ef87563$1 _1@news.unc.edu ...[color=blue]
        > Hi++,
        >
        > I get a link error when I try to call a template function that is
        > declared in a header file and defined in a non-header file. I do *not*
        > get this link error if I define the template function directly in the
        > header file, or if the change the function to non-template.
        >
        > For example...
        > *** Why am I getting a link error for template function f() in the code
        > below?
        >
        > Thanks!
        > Suzanne
        >
        > -----------------------------------
        > // File: Main.cpp
        >
        > #include "Templates. h"
        >
        > int main(int argc, char** argv) {
        > f<int>(5); // <--link error here
        > }
        > -----------------------------------
        > // File: Templates.h
        >
        > #ifndef TEMPLATES_H
        > #define TEMPLATES_H
        >
        > #ifndef _STD_USING
        > #define _STD_USING // Must be #define'd in order to include iostream.h.
        > #endif // _STD_USING
        >
        > #include <iostream>
        >
        > template<class T>
        > void f(T n);
        >
        > #endif // TEMPLATES_H
        > -----------------------------------
        > // File: Templates.cpp
        >
        > #include "Templates. h"
        >
        > template<class T>
        > void f(T n) {
        > std::cout << "I got an \"n\"!\n";
        > }
        >[/color]


        Comment

        • Michiel Salters

          #5
          Re: link error if template function is defined in non-header file

          Suzanne <suzanne_e_voge l@hotmail.com> wrote in message news:<3ef87563$ 1_1@news.unc.ed u>...[color=blue]
          > Hi++,
          >
          > I get a link error when I try to call a template function that is
          > declared in a header file and defined in a non-header file. I do *not*
          > get this link error if I define the template function directly in the
          > header file, or if the change the function to non-template.[/color]

          Theoretically, because you didn't include the keyword 'export' in the
          declaration. That tells the compiler to defer template instantiation
          to the linker.

          In practice, most linkers can't do this yet and you need the definition
          inlined in your header.

          HTH,
          --
          Michiel Salters

          Comment

          • Corey Murtagh

            #6
            Re: [OT gripe...] link error if template function is defined in non-headerfile

            Chandra Shekhar Kumar wrote:
            [color=blue]
            > coz, compiler can't see the definition of the function f.
            > so u shud include the definition of f in the header file, this is the
            > practice for all the template functions[/color]

            I'm sorry if I seem like a real ass for saying this, but these
            contractions are really getting up my nose for some reason. Is it
            really that hard to type the word 'you' that you absolutely must reduce
            it to 'u'? Same question for 'should' and 'shud'. Is your shift key
            broken?

            I don't know if this bugs anyone else. I've always thought of
            programmers as being careful people who pay plenty of attention to case
            and so on.

            Ah hell, maybe you *did* learn English from an IRC channel. *shrug*

            --
            Corey Murtagh
            The Electric Monk
            "Quidquid latine dictum sit, altum viditur!"

            Comment

            • Gavin Deane

              #7
              Re: [OT gripe...] link error if template function is defined in non-header file

              Corey Murtagh <emonk@slingsho t.co.nz.no.uce> wrote in message news:<105655601 8.991794@radsrv 1.tranzpeer.net >...[color=blue]
              > Chandra Shekhar Kumar wrote:
              >[color=green]
              > > coz, compiler can't see the definition of the function f.
              > > so u shud include the definition of f in the header file, this is the
              > > practice for all the template functions[/color]
              >
              > I'm sorry if I seem like a real ass for saying this, but these
              > contractions are really getting up my nose for some reason. Is it
              > really that hard to type the word 'you' that you absolutely must reduce
              > it to 'u'? Same question for 'should' and 'shud'. Is your shift key
              > broken?
              >
              > I don't know if this bugs anyone else.[/color]

              I'm in.

              Comment

              Working...