[ BinaryRuler @ 07.04.2010. 20:51 ] @
Naisao sam na problem sa linkovanjem kada sam hteo da napravim sablonsku statik metodu. Metoda lepo radi kada se koristi unutar te klase ali javlja se problem sa linkovanjem kada se koristi izvan klase.

error:
main.obj : error LNK2019: unresolved external symbol "public: static void __cdecl CUtility::foo<long>(long)" (??$foo@J@CUtility@@SAXJ@Z) referenced in function _main
fatal error LNK1120: 1 unresolved externals

Evo koda:

Utility.h
Code:

#ifndef UTILITY_H
#define UTILITY_H

class CUtility
{
public:
    template<typename T1>
    static void foo(T1 value);
    template<typename T2>
    static void foo1(T2 value);
};
#endif


Utility.cpp
Code:

#include "Utility.h"

template<typename T1>
void CUtility::foo(T1 value)
{
    long k;
    foo1<long>(k);
    value++;
    //.............
}
    
template<typename T2>
void CUtility::foo1(T2 value)
{
    value++;
    //...........
}


main.cpp
Code:

#include "Utility.h"

int main()
{
    long i;
    CUtility::foo<long>(i);//Bez ove linije linkuje
    return 0;
}


Ne znam gde gresim.
[ kiklop74 @ 07.04.2010. 21:24 ] @
Nacin na koji pises kod se ne koristi za template klase. U slucaju template klasa generalno pravilo je da sav kod ide u heder.

Sto ce reci:

Code:


#ifndef UTILITY_H
#define UTILITY_H

class CUtility
{
public:
    template<typename T1>
    static void foo(T1 value) {
         //neki kod
    }
    template<typename T2>
    static void foo1(T2 value) {
        //neki kod
    }
};

#endif /* UTILITY_H */

[ BinaryRuler @ 07.04.2010. 21:30 ] @
A da li postoji nacin da se stavi implementacija u separatni fajl.
Posto sam negde na netu nasao primer (postovacu kasnije link), ali nisu bile u pitanju static metode.
[ BinaryRuler @ 07.04.2010. 21:35 ] @
Moja greska, izgleda da ipak mora u heder.
[ kiklop74 @ 07.04.2010. 21:49 ] @
Moze i to ali sve mora da bude ukljuceno u cpp fajl pre nego sto se moze koristiti.

Na primer:

Code:

#ifndef UTILITY_H
#define UTILITY_H

class CUtility
{
public:
    template<typename T1>
    static void foo(T1 value);
    template<typename T2>
    static void foo1(T2 value);
};

//Obrati paznju na ovo
#include "util.inc"

#endif /* UTILITY_H */


Code:

//util.inc file
template<typename T1>
void CUtility::foo(T1 value)
{
    long k;
    foo1<long>(k);
    value++;
    //.............
}
    
template<typename T2>
void CUtility::foo1(T2 value)
{
    value++;
    //...........
}


I na kraju cpp

Code:

#include "Utility.h"

int main() {
  CUtility::foo<long>(1);
  return 0;
}





[ BinaryRuler @ 07.04.2010. 22:06 ] @
Ok hvala puno na odgovoru.