Распространение 'typedef' из базового в производный класс для 'template'

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))));
60
задан curiousguy 16 August 2012 в 17:43
поделиться

5 ответов

Я считаю, что этот вопрос повторяется, но сейчас я не могу его найти. Стандарт C ++ говорит, что вы должны полностью указать имя в соответствии с 14.6.2 / 3:

В определении шаблона класса или члена шаблона класса, если базовый класс шаблона класса зависит от параметра шаблона, область базового класса не проверяется во время неквалифицированного поиска имени ни в точке определения шаблона или члена класса, ни во время создания экземпляра шаблона или члена класса.

UPD: Я обнаружил дубликат наконец: вот он .

44
ответ дан 24 November 2019 в 17:20
поделиться

В случае шаблонов есть что-то, что называется зависимыми и независимыми именами.

Если имя зависит от параметра шаблона T, его зависимое имя и другие те, которые не зависят от параметра T, являются независимыми именами.

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

Компилятор не может предположить, что Vec_t является типом, пока не узнает T , потому что существует потенциальная специализация A где A :: Vec_t - это член данных

Итак, решение - использовать 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

37
ответ дан 24 November 2019 в 17:20
поделиться

Потому что компилятор не уверен, что Vec_t называет тип. Например, A может быть специализирован для T = int до , но не имеет этого конкретного typedef .

7
ответ дан 24 November 2019 в 17:20
поделиться

. Вам необходимо явно указать использование Vec_t , потому что компилятор не знает, где Vec_t ] происходит от.

Он не может ничего предполагать о структуре A, поскольку шаблон класса A может быть специализированным. Специализация может включать Vec_t , который не является typedef, или может даже не включать член Vec_t вообще.

2
ответ дан 24 November 2019 в 17:20
поделиться

Vec_t не является зависимым именем, и компилятор должен знать, что это такое, без создания экземпляров каких-либо шаблонов (базовый класс в этом кейс). На самом деле это ничем не отличается от:

template <class T>
class X
{
    std::string s;
}

Здесь также компилятор должен знать о std :: string, даже если X не создан, поскольку имя не зависит от аргумента шаблона T (насколько компилятор может предположить) .

В общем, typedef в базовом классе шаблона кажется бесполезным для использования в производном классе. Однако определения типов полезны для пользователя.

1
ответ дан 24 November 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: