Ominięcie błędów linkera w funkcji generycznej (template)

Ominięcie błędów linkera w funkcji generycznej (template)
IT
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 111
0

Potrzebuję utworzyć statyczną funkcję generyczną (taką, która używa niezdefiniowanego typu klasy). Niestety mam dość małe doświadczenie w C++ i nie bardzo potrafię sobie z tym poradzić.

Wygląda to tak:

W pliku *.h deklaruję funkcję:

Kopiuj
template <class T> static T* LoadFromFile(std::string fileName, bool isDirected);

W pliku *.cpp definiuję ją:

Kopiuj
template <class T>
T* Container::LoadFromFile(std::string fileName, bool isDirected)
{
// tutaj generuję jakąś instancję T, przeprowadzam jakieś operacje na niej, po czym ją zwracam
}

I w funkcji main używam jej tak:

Kopiuj
AdjacencyList* al = AdjacencyList::LoadFromFile<AdjacencyList>("dane_droga.txt", false);

Linker zwraca mi LNK2019 error (unresolved external symbol). Dotarłem już nawet do rozwiązania tego problemu: https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl
W artykule proponują mi kilka rozwiązań, ja wolałbym uniknąć umieszczania deklaracji w headerfile więc, próbuję z opcją ostatnią:

Kopiuj
template void foo<int>();

Próbuję na wszystkie sposoby dostosować to do mojego przypadku, niestety bez powodzenia:

Kopiuj
template AdjacencyList* LoadFromFile<AdjacencyList>(std::string fileName, bool isDirected);

Function definition for 'LoadFromFile' not found

Ma ktoś pomysł jak to dostosować do mojej funkcji?

MO
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tam gdzie jest (centy)metro...
0

Albo namieszałeś albo nie zrozumiałem intencji:

container.h:

Kopiuj
#pragma once

#include <string>

template<typename T>
struct Container {
    // Z zasady lepiej nie kopiować string'a
    static T* LoadFromFile(const std::string& fileName, bool isDirected);
};

container.cpp:

Kopiuj
#include "container.h"

template<typename T>
T* Container<T>::LoadFromFile(const std::string& fileName, bool isDirected) {
    return nullptr;
}

#include "container.tpp"

container.tpp:

Kopiuj
#include "adjacency_list.h"

template struct Container<AdjacencyList>;

adjacency_list.h:

Kopiuj
#pragma once

struct AdjacencyList {
};

main.cpp:

Kopiuj
#include "container.h"
#include "adjacency_list.h"

int main() {
    AdjacencyList * al = Container<AdjacencyList>::LoadFromFile("dane_droga.txt", false);
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.