Почему typename для наследования конструктора не требуется [дублировать]

Я все еще тестирую свое решение, но оно отличается от сделанных предложений и до сих пор безупречно работает. Просто другой подход:

Я добавляю метку и окружаю мою попытку скопировать с помощью обработчика ошибок ...

Pg1CopyAttempt:
    DoEvents
    shSomeSheet.Range("A1:G30").Copy
    On Error GoTo Pg1PasteFail
    WordApp.Selection.PasteExcelTable False, False, False
    On Error goto 0 'disable the error handler 

Я вызываю метку «Pg1CopyAttempt», потому что знаю, что Excel, без моего собственного недостатка, может не копировать его в буфер обмена. Если Excel меня подведет, я не буду знать, пока не попытаюсь вставить. Когда я пытаюсь, я попадаю в обработчик ошибок (Pg1PasteFail), когда метод пасты терпит неудачу. Это сидит в нижней части моей подпрограммы (после прямого выхода или процедуры выхода).

Pg1PasteFail:
If Err.Number = 4605 Then ' clipboard is empty or not valid.
    DoEvents
    Resume Pg1CopyAttempt
 End If

Было бы лучше протестировать пустой буфер обмена программно, чем полагаться на обработчик ошибок, но Идея здесь заключается в том, чтобы заставить цикл, чтобы он продолжал копировать, пока не будет успешным. Более простой цикл с программным тестированием буфера обмена может использовать функцию ClipboardEmpty от Sean (см. Выше). DoEvents все еще эксплуатируется, но даже с DoEvents подпрограммы могут выйти из строя, и им просто поручено продолжать попытки.

910
задан MSalters 1 June 2016 в 12:28
поделиться

4 ответа

940
ответ дан Alan 24 August 2018 в 21:42
поделиться
77
ответ дан Community 24 August 2018 в 21:42
поделиться
typedef typename Tail::inUnion<U> dummy;

Однако я не уверен, что реализация inUnion верна. Если я правильно понимаю, этот класс не должен быть создан, поэтому вкладка «fail» никогда не будет автоматически терпеть неудачу. Возможно, было бы лучше указать, находится ли тип в объединении или нет с простым булевым значением.

template <typename T, typename TypeList> struct Contains;

template <typename T, typename Head, typename Tail>
struct Contains<T, UnionNode<Head, Tail> >
{
    enum { result = Contains<T, Tail>::result };
};

template <typename T, typename Tail>
struct Contains<T, UnionNode<T, Tail> >
{
    enum { result = true };
};

template <typename T>
struct Contains<T, void>
{
    enum { result = false };
};

PS: Посмотрите на Boost :: Variant

PS2: посмотрите на typelists , особенно в книге Андрея Александреску: Modern C ++ Design

18
ответ дан Luc Touraille 24 August 2018 в 21:42
поделиться

Я помещаю превосходный ответ JLBorges на аналогичный вопрос дословно из cplusplus.com, так как это наиболее краткое объяснение, которое я прочитал по этому вопросу.

] В шаблоне, который мы пишем, есть два типа имен, которые можно использовать - зависимые имена и не зависимые имена. Зависимое имя - это имя, которое зависит от параметра шаблона; неизменяемое имя имеет то же значение, независимо от параметров шаблона.

Например:

template< typename T > void foo( T& x, std::string str, int count )
{
    // these names are looked up during the second phase
    // when foo is instantiated and the type T is known
    x.size(); // dependant name (non-type)
    T::instance_count ; // dependant name (non-type)
    typename T::iterator i ; // dependant name (type)

    // during the first phase, 
    // T::instance_count is treated as a non-type (this is the default)
    // the typename keyword specifies that T::iterator is to be treated as a type.

    // these names are looked up during the first phase
    std::string::size_type s ; // non-dependant name (type)
    std::string::npos ; // non-dependant name (non-type)
    str.empty() ; // non-dependant name (non-type)
    count ; // non-dependant name (non-type)
}

То, что зависит от зависимого имени, может быть чем-то другим для каждого конкретного экземпляра шаблона. Как следствие, шаблоны C ++ подвержены «двухфазному поиску имен». Когда шаблон сначала анализируется (до того, как выполняется какое-либо создание), компилятор просматривает не зависящие имена. Когда происходит конкретное создание шаблона, параметры шаблона известны к тому времени, и компилятор ищет зависимые имена.

На первом этапе анализатор должен знать, является ли зависимое имя именем типа или имени не-типа. По умолчанию зависимым именем считается имя не-типа.

Использовать ключевое слово typename только в объявлениях шаблонов и определениях, приведенных ниже.


у вас есть квалифицированное имя, которое относится к типу и зависит от параметра шаблона.

1
ответ дан Nik-Lz 24 August 2018 в 21:42
поделиться
Другие вопросы по тегам:

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