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

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ę:

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

W pliku *.cpp definiuję ją:

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:

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ą:

template void foo<int>();

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

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

Function definition for 'LoadFromFile' not found

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

0

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

container.h:

#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:

#include "container.h"

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

#include "container.tpp"

container.tpp:

#include "adjacency_list.h"

template struct Container<AdjacencyList>;

adjacency_list.h:

#pragma once

struct AdjacencyList {
};

main.cpp:

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1