• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak przygotować deklaracje funkcji dla template

VPS Starter Arubacloud
0 głosów
365 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez Mateusz Tocha Bywalec (2,560 p.)

Cześć 

Taki kod działa poprawnie: 

https://ideone.com/RuKH0Q (deklaracja funkcji w pliki *.h)

natomiast taki już nie:

https://ideone.com/gLUjFG 

Bład podczas budowania projektu z cmake version 3.10.2

undefined reference to `std::shared_ptr<RawModel> Loader::loadToVAO<float, 8ull>(std::array<float, 8ull>&, void const*)' 

jak powinna wygladac deklaracja funkcji w pliku *.cpp zeby spełnia założenia prototypu?

Jezeli potrzebny pełny projekt to udostepnie. 

 

 

2 odpowiedzi

+2 głosów
odpowiedź 4 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 4 marca 2018 przez Mateusz Tocha
 
Najlepsza
Szablony funkcji muszą mieć swoje definicje w tych samych jednostkach translacyjnych (plik źródłowy z dołączonymi nagłówkami), w których występują ich użycia.

Oznacza to więc, że jeśli przenosisz szablony między plikami źródłowymi, to definicje muszą się znajdować w nagłówku. Jeśli używasz tylko w jednym pliku źródłowym, to możesz przechowywać takie definicje gdziekolwiek, czyli w nagłówku lub źródle (tym, który dołącza nagłówek).
komentarz 4 marca 2018 przez Mateusz Tocha Bywalec (2,560 p.)
edycja 4 marca 2018 przez Mateusz Tocha

Dziękuje za odpowiedż 

Czy ten kod z innego miejsca tego projektu dziala tylko dlatego ze w deklaracji template okreslam jawnie dla jakiego typu jest dane przeciążenie? Tutaj Deklaracja i definicja sa w rożych plikach.

https://ideone.com/nJCY39

komentarz 4 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)
Tak, kompilator pozwala na używanie definicji specjalizacji szablonów funkcji ze skompilowanych modułów (czyli innych plików źródłowych).
komentarz 4 marca 2018 przez Mateusz Tocha Bywalec (2,560 p.)
Ok dziękuje za pomoc w wyjaśnieniu.
0 głosów
odpowiedź 4 marca 2018 przez mokrowski Mędrzec (156,260 p.)

Powinieneś uczulić kompilator by wygenetował w pliku implementacji odpowiedni szablon. Będzie on użyty na etapie konsolidacji. Praktykuje się także wyprowadzenie takiej dyrektywy (ostatnia linia fooclass.cpp), do oddzielnych plików.

Szablony funkcji muszą mieć swoje definicje w tych samych jednostkach translacyjnych (plik źródłowy z dołączonymi nagłówkami), w których występują ich użycia.

To nieprawda w świetle tego co pisałem wcześniej. Oto prosty przykład:

fooclass.hpp:

#pragma once

template<typename T>
class FooClass {
public:
    explicit FooClass(T t);
    void info() const;
private:
    T data;
};

fooclass.cpp:

#include "fooclass.hpp"
#include <iostream>

template<typename T>
FooClass<T>::FooClass(T t): data{t} {}

template<typename T>
void FooClass<T>::info() const {
    std::cout << "FooClass::info(), data: " << data << '\n';
}

template class FooClass<int>;

main.cpp:

#include "fooclass.hpp"

int main() {
    FooClass<int> fooClass(42);
    fooClass.info();
}

Oficjalne FAQ komisii ISO języka C++:

https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl

.. i następne 3-4 punkty.

komentarz 4 marca 2018 przez Mateusz Tocha Bywalec (2,560 p.)

wieszk jaka to skonfigurowac w pliku Cmakelist?

cmake_minimum_required(VERSION 3.0.0)
project(One_Triangle VERSION 0.0.0)

include(CTest)

include_directories(C:/msys64/mingw64/include)
include_directories(/src)
include_directories(/src/vendor/stb_image)


find_library(OPENGL libopengl32.a C:/msys64/usr/lib/w32api)
find_library(GLFW3 libglfw3.a C:/msys64/mingw64/lib)
find_library(GLEW glew32 C:/msys64/mingw64/lib)

add_definitions(-DGLEW_STATIC)
add_definitions(-D_WIN32=1)


set(SOURCE_DIR src/)
set(SOURCE 
${SOURCE_DIR}VertexBuffer.cpp
${SOURCE_DIR}IndexBuffer.cpp
${SOURCE_DIR}VertexArray.cpp
${SOURCE_DIR}VertexBufferLayout.cpp
${SOURCE_DIR}Shader.cpp
${SOURCE_DIR}Renderer.cpp
${SOURCE_DIR}DisplayMenager.cpp
${SOURCE_DIR}RawModel.cpp
${SOURCE_DIR}Loader.cpp
${SOURCE_DIR}vendor/stb_image/stb_image.cpp
${SOURCE_DIR}Texture.cpp
)

add_executable(One_Triangle main.cpp ${SOURCE})
message("======${OPENGL} =========== /n")
message("------${GLFW3} ------------ /n")
message("------${GLEW} ------------ /n")
target_link_libraries(One_Triangle ${OPENGL} ${GLFW3} ${GLEW})

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

tak to na razie wyglada 

gcc version 7.3.0 (Rev1, Built by MSYS2 project)

 

komentarz 4 marca 2018 przez Mateusz Tocha Bywalec (2,560 p.)

wyglada na to ze wystraczy dodac flage do pliku :

add_definitions(-Dfno-implicit-templates)


http://www.network-theory.co.uk/docs/gccintro/gccintro_60.html

Podobne pytania

0 głosów
1 odpowiedź 157 wizyt
0 głosów
0 odpowiedzi 413 wizyt
pytanie zadane 24 marca 2018 w C i C++ przez Mateusz Tocha Bywalec (2,560 p.)
0 głosów
2 odpowiedzi 202 wizyt
pytanie zadane 24 września 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)

92,980 zapytań

141,943 odpowiedzi

321,189 komentarzy

62,307 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...