2017-02-02 3 views
1

Я был знаком с C++ и теперь просматриваю шаблоны и столкнулся с этим вопросом.Код заголовка C++ с шаблоном

Если тип шаблона требует другого класса, будет ли конкретное требование заголовка включать порядок?

vector<string> stringVector; 

Как это: мы должны включать string до vector?

Я читал это (C++ Header order), и он говорит, что заголовочные файлы должны быть включены в порядок требований к классу.

Однако, как это (Template Compilation) указывает на то, или, если это мое недоразумение, «компилятор генерирует код для конкретных типов данных в шаблоне класса экземпляра», и я думаю, что это означает, что, когда мы инстанцировании stringVector, компилятор уже включен string заголовок, поэтому не должно быть «vector здесь string требуется».

Итак, какая интерпретация правильная, и какая часть моей интерпретации правильная или неправильная? Благодарю.

ответ

3

Всякий раз, когда вы используете шаблон в C++, используемый тип шаблона должен быть известен как полный тип, который требует, чтобы вы включили класс string, когда хотите использовать вектор строки. Вложения - это не что иное, как копирование и вставка кода в включенном файле туда, где размещается ваш объект.

1> #include <string> 
2> #include <vector> 
3> 
4> class Foo { 
5> private: 
6>  vector<string> bar;  
7> } 

Когда линия 6 компилируется, компилятор должен знать оба типа как полный типа (строка, поскольку его шаблон, вектор, потому что его не указатель). Вложения помещаются над классом, поэтому компилятор знает оба типа, когда он хочет скомпилировать строку 6. Не имеет значения, какой заказ вы их включили.

1

В основном вы должны включить все функции dependecies перед их использованием. Так что в вашем примере это не имеет значения, если сначала включить строку или вектор. Они просто должны быть включены как до их использования.

Заказ имеет значение, если файлы заголовков зависят друг от друга. Допустим, что есть файл заголовка a.h и b.h, где b.h - зависимость от a.h. ТОГДА a.h должен быть включен первым. Но если кто-то должен это делать, программа не написана чистым способом. Все зависимости файла заголовка должны быть включены в заголовочный файл с использованием include guard, а не в другом месте.

Это насколько я понимаю.

+0

спасибо за завершение :) Важно, что «если кто-то должен это делать, программа не написана чистым способом». – Janis