Учитывая шаблонный класс, подобный следующему:
template<typename Type, typename IDType=typename Type::IDType>
class Mappings
{
public:
...
Type valueFor(const IDType& id) { // return value }
...
};
Как кто-то может напрямую объявить этот класс в файле заголовка?
c++
templates
forward-declaration
Трон Томас
источник
источник
Вы можете объявить аргументы по умолчанию для шаблона только для первого объявления шаблона. Если вы хотите, чтобы пользователи могли пересылать объявление шаблона класса, вы должны предоставить заголовок пересылки. Если вы хотите переслать объявление чужого шаблона класса с использованием значений по умолчанию, вам не повезло!
источник
Вы можете объявить шаблонный класс, в определении которого указаны аргументы по умолчанию, но каждый раз, когда вы ссылаетесь на класс, вы должны включать все его аргументы, пока не будет введено определение.
например. Давайте использовать,
std::vector
не включая его (второй аргументstd::vector
определяется по умолчанию):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; }
Затем мы можем использовать его без включения вектора, например:
int main () { Foo(3); }
... Или мы можем использовать его с
std::vector
, например .:#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)); }
Я не проверял стандарты, но это работает до
clang
/gcc
с-std=c++98
до-std=c++17
, поэтому, если это не официально стандарт, то это выглядит неофициально.источник
Foo<> foo;
.