• 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

Object Storage Arubacloud
0 głosów
300 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 (155,460 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ź 149 wizyt
0 głosów
0 odpowiedzi 349 wizyt
pytanie zadane 24 marca 2018 w C i C++ przez Mateusz Tocha Bywalec (2,560 p.)
0 głosów
2 odpowiedzi 177 wizyt
pytanie zadane 24 września 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...