c++ template - "Vorlage<>" vs "Vorlage" ohne Klammern-was ist der Unterschied?



specialization function (3)

Angenommen, ich habe erklärt:

template <typename T> void foo(T& t);

Worin besteht der Unterschied?

template <> void foo<int>(int& t);

und

template void foo<int>(int& t);

semantisch? Und haben Template-with-No-Brackets und Template-with-Left-Brackets eine andere Semantik in anderen Kontexten?

Verwandt mit: Wie forciere ich, dass eine bestimmte Instanz einer C ++ - Vorlage instanziiert wird?


Answers

Mit Klasse / Struktur,

template <typename T> struct foo {};

Folgendes ist eine Spezialisierung:

template <> struct foo<int>{};

Folgendes ist eine explizite Instanziierung:

template struct foo<int>;

template <> void foo<int>(int& t); deklariert eine Spezialisierung des Templates mit potenziell anderem Körper.

template void foo<int>(int& t); bewirkt eine explizite Instanziierung der Vorlage, führt jedoch keine Spezialisierung ein. Es erzwingt nur die Instanziierung der Vorlage für einen bestimmten Typ.


#include "filename" // User defined header
#include <filename> // Standard library header.

Beispiel:

Der Dateiname hier ist Seller.h :

#ifndef SELLER_H     // Header guard
#define SELLER_H     // Header guard

#include <string>
#include <iostream>
#include <iomanip>

class Seller
{
    private:
        char name[31];
        double sales_total;

    public:
        Seller();
        Seller(char[], double);
        char*getName();

#endif

In der Klassenimplementierung (beispielsweise Seller.cpp und in anderen Dateien, die die Datei Seller.h ) sollte der vom Benutzer definierte Header jetzt wie folgt Seller.h werden:

#include "Seller.h"




c++ templates template-specialization