Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Konstruktor domyślny w szablonie klasy

Ostatnio zmodyfikowano 2015-07-21 16:37
Autor Wiadomość
Lukier
Temat założony przez niniejszego użytkownika
[C++] Konstruktor domyślny w szablonie klasy
» 2015-07-21 16:02:01
Witam mam pewien problem z konstruktorem domyślnym dla szablonu klasy. Mianowicie, o ile specjalizacje dla konstruktora domyślnego działają jak należy to sam konstruktor dla reszty typów jest nie widoczny dla kompilatora jakby go wcale nie było i nie wiem dlaczego. Bym był wdzięczny jeśli ktoś by mnie oświecił i napisał co tu jest źle.

list.h
C/C++
#ifndef LIST_H_
#define LIST_H_

template < class T >
class list
{
    T value;
    list * next;
public:
    list();
};

#endif

list.cpp
C/C++
#include <iostream>
#include <string>

#include "list.h"

template < class T >
list < T >::list()
{
    next = NULL;
    value = 0;
    std::cout << "sdasd" << std::endl;
}

template <>
list < char >::list()
{
    next = NULL;
    value = '0';
}

template <>
list < std::string >::list()
{
    next = NULL;
    value = "";
    std::cout << "Dk\n" << std::endl;
}

main.cpp
C/C++
#include <iostream>
#include <string>

#include "list.h"


int main()
{
    list < int >* j = new list < int >();
    std::cin.get();
    return 0;
}
P-135020
Monika90
» 2015-07-21 16:10:36
definicję konstruktora domyślnego i obie jego jawne specjalizacje musisz przenieść do pliku list.h
P-135021
Lukier
Temat założony przez niniejszego użytkownika
» 2015-07-21 16:20:10
Czyli winą jest moje nie przypilnowanie faktu, że definicja konstruktora w postaci szablonu posiada łączenie wewnętrzne w pliku, lecz w tym przypadku specjalizacje też nie powinny posiadać łączenia wewnętrznego i być również nie widoczne dla kompilatora?
P-135024
Monika90
» 2015-07-21 16:26:31
One wszystkie są łączone zewnętrznie, ale konstruktor list<int>::list() po prostu nie istnieje.

Kiedy kompilator kompiluje plik main.cpp, to wie że musi wygenerować specjalizację dla int, ale nie wie jak, bo nie ma definicji. Kiedy kompiluje list.cpp, to wie jak, ale nie wie że musi, bo w tej jednostce translacji list<int>::list() nie jest użyte.
P-135026
Lukier
Temat założony przez niniejszego użytkownika
» 2015-07-21 16:37:58
Rozumiem. Dziękuje za szybką odpowiedź i pomoc.
P-135029
« 1 »
  Strona 1 z 1