Здесь много правильных ответов, но я хотел добавить это (для полноты):
Если вы в нижней части файла cpp реализации выполняете явное инстанцирование всех типов, которые будут использоваться шаблоном с, компоновщик сможет найти их как обычно.
Изменить: добавление примера явного создания экземпляра шаблона. Используется после того, как шаблон определен, и определены все функции-члены.
template class vector<int>;
Это создаст экземпляр (и, следовательно, сделает доступным для компоновщика) класс и все его функции-члены (только). Подобный синтаксис работает для функций шаблона, поэтому, если у вас есть перегрузки операторов, не являющихся членами, вам может понадобиться сделать то же самое для них.
Вышеприведенный пример бесполезен, поскольку вектор полностью определен в заголовках, за исключением случаев, когда common include file (precompiled header?) использует extern template class vector<int>
, чтобы не создавать его из всех других (1000?) файлов, которые используют вектор.
Если вы хотите сопоставить все кавычки и вопросительные знаки, как указано в вашем вопросе, тогда ваш шаблон в порядке. Проблема в том, что Regex.Match
будет возвращать только первое совпадение, которое он найдет. Из MSDN :
Ищет во входной строке первое вхождение указанного регулярного выражения ...
blockquote>Вы, вероятно, захотите использовать
Matches
:string sentence = "\"This is the end?\""; MatchCollection allPunctuation = Regex.Matches(sentence, "[\"?]"); foreach(Match punctuation in allPunctuation) { Console.WriteLine("Found {0} at position {1}", punctuation.Value, punctuation.Index); }
Это вернет:
Found " at position 0 Found ? at position 16 Found " at position 17
Я бы также отметил, что если вы действительно хотите соответствовать всем символам пунктуации, включая такие вещи, как «французские» кавычки (
«
и»
), «умные» кавычки (“
и”
), перевернутые знаки вопроса (¿
) и многие другие, вы можете использовать категории символов Unicode с шаблоном, подобным\p{P}
.
Вы должны вызывать Матчи вместо Матча.
Пример:
string sentence = "\"This is the end?\"";
var matches = Regex.Matches(sentence, "[\"?]");
var punctuationLocations = string.Empty;
foreach(Match match in matches)
{
punctuationLocations += match.Value + " at index:" + match.Index + Environment.NewLine;
}
// punctuationLocations:
// " at index:0
// ? at index:16
// " at index:17