Directory.GetFiles
дает вам список имен файлов, включая пути. Вы пытаетесь сопоставить свое регулярное выражение с такими результатами: «C: \ WaveFiles \ 123.wav».
Вы ожидаете, что вся эта строка начнется с цифры, а затем будет содержать только цифры до «.wav», который, конечно, не будет соответствовать ни одному из ваших файлов.
Вы также можете заменить [0-9]
на \d
для цифр, но это вопрос предпочтения.
Попробуйте следующее:
Regex reg = new Regex(@"^\d+\.wav");
string[] waveFilePaths = Directory.GetFiles("C:\\WaveFiles", "*.wav");
Stack<string> filesWithOnlyDigits = new Stack<string>(waveFilePaths
.Where(path => reg.IsMatch(Path.GetFileName(path))));
Я считаю, что этот вопрос повторяется, но сейчас я не могу его найти. Стандарт C ++ говорит, что вы должны полностью указать имя в соответствии с 14.6.2 / 3:
В определении шаблона класса или члена шаблона класса, если базовый класс шаблона класса зависит от параметра шаблона, область базового класса не проверяется во время неквалифицированного поиска имени ни в точке определения шаблона или члена класса, ни во время создания экземпляра шаблона или члена класса.
UPD: Я обнаружил дубликат наконец: вот он .
В случае шаблонов есть что-то, что называется зависимыми и независимыми именами.
Если имя зависит от параметра шаблона T, его зависимое имя и другие те, которые не зависят от параметра T, являются независимыми именами.
Вот правило: компилятор не посмотрите в зависимых базовых классах (например, А) при поиске независимого имена (например, Vec_t). Как результат, компилятор не знает, что они даже существуют не говоря уже о типах.
Компилятор не может предположить, что Vec_t
является типом, пока не узнает T
, потому что существует потенциальная специализация A
где A
- это член данных
Итак, решение - использовать typename
typename A<T>::Vec_t v; ← good
. Я рекомендую вам пройти через это https://isocpp.org/wiki /faq/templates#nondependent-name-lookup-types.
Старая (неработающая) ссылка: http://www.parashift.com/c++-faq-lite/templates.html#faq- 35.18
Потому что компилятор не уверен, что Vec_t
называет тип. Например, A
может быть специализирован для T = int
до , но не имеет этого конкретного typedef
.
. Вам необходимо явно указать использование Vec_t
, потому что компилятор не знает, где Vec_t
] происходит от.
Он не может ничего предполагать о структуре A, поскольку шаблон класса A может быть специализированным. Специализация может включать Vec_t
, который не является typedef, или может даже не включать член Vec_t
вообще.
Vec_t не является зависимым именем, и компилятор должен знать, что это такое, без создания экземпляров каких-либо шаблонов (базовый класс в этом кейс). На самом деле это ничем не отличается от:
template <class T>
class X
{
std::string s;
}
Здесь также компилятор должен знать о std :: string, даже если X не создан, поскольку имя не зависит от аргумента шаблона T (насколько компилятор может предположить) .
В общем, typedef в базовом классе шаблона кажется бесполезным для использования в производном классе. Однако определения типов полезны для пользователя.