Biorąc pod uwagę klasę szablonu, taką jak poniższa:
template<typename Type, typename IDType=typename Type::IDType>
class Mappings
{
public:
...
Type valueFor(const IDType& id) { // return value }
...
};
Jak ktoś może przekazać dalej tę klasę w pliku nagłówkowym?
c++
templates
forward-declaration
Tron Thomas
źródło
źródło
Możesz zadeklarować domyślne argumenty dla szablonu tylko dla pierwszej deklaracji szablonu. Jeśli chcesz, aby użytkownicy mogli przekazywać dalej deklarowanie szablonu klasy, należy podać nagłówek przekazywania. Jeśli chcesz przekazać dalej zadeklarować szablon klasy innej osoby przy użyciu wartości domyślnych, nie masz szczęścia!
źródło
Państwo może zadeklarować klasę na matrycy którego definicja wskazuje argumenty domyślne, ale za każdym razem można odwołać klasę musi obejmować wszystkie swoje argumenty, aż zostanie wprowadzona definicja.
na przykład. Użyjmy
std::vector
bez dołączania go (drugi argumentstd::vector
jest zdefiniowany domyślnie):namespace std { template<typename, typename> class vector; } #include <iostream> template <typename S, typename T> void Foo (const std::vector<S,T> & vector) { std::cout << "do vector stuff, eg., display size = " << vector.size() << std::endl; } template <typename T> void Foo (const T & t) { std::cout << "do non-vector stuff..." << std::endl; }
Możemy wtedy użyć go bez dołączania wektora, np .:
int main () { Foo(3); }
... Albo możemy używać go z
std::vector
, np .:#include <vector> // Now the compiler understands how to handle // std::vector with one argument // (making use of its default argument) int main () { Foo(std::vector<int>(3)); }
Nie sprawdzałem standardów, ale działa to
clang
/gcc
z-std=c++98
maksymalnie do-std=c++17
, więc jeśli nie jest to oficjalnie norma, to wygląda na to, że jest nieoficjalnie.źródło
Foo<> foo;
.