Шаблонный класс в шаблоне класса в C++

Для [1 112] HTML 4 , ответ технически:

идентификатор и маркеры ИМЕНИ должны начаться с буквы ([A-Za-z]) и могут сопровождаться любым количеством букв, цифрами ([0-9]), дефисы (" - "), подчеркивания (" _ "), двоеточия (": "), и периоды (". ").

HTML 5 является еще более разрешающим, говоря только, что идентификатор должен содержать по крайней мере один символ и не может содержать пробелы.

идентификационный атрибут чувствителен к регистру в [1 114] XHTML.

Как чисто практический вопрос, можно хотеть избежать определенных символов. Периоды, двоеточия и '#' имеют особое значение в селекторах CSS, таким образом, необходимо будет выйти из тех символов с помощью обратная косая черта в CSS или двойная обратная косая черта в , селекторная строка передала jQuery. Думайте о том, как часто необходимо будет выйти из символа в таблицах стилей или коде, прежде чем Вы сойдете с ума с периодами и двоеточиями в идентификаторах.

, Например, объявление

HTML допустимо. Можно выбрать тот элемент в CSS как #first\.name и в jQuery как так: $('#first\\.name')., Но если Вы забываете обратную косую черту, $('#first.name'), у Вас будет совершенно допустимый селектор, ища элемент с идентификатором first и также имея класс name. Это - ошибка, которую легко пропустить. Вы могли бы быть более счастливыми в конечном счете выбор идентификатора first-name (дефис, а не период), вместо этого.

можно упростить задачи разработки путем строгого придерживания соглашения о присвоении имен. Например, если Вы ограничиваете себя полностью символами нижнего регистра и всегда разделяете слова или с дефисами или с подчеркиваниями (но не оба, выберите один и никогда не используйте другой), тогда у Вас есть легкий, чтобы помнить шаблон. Вы никогда не будете задаваться вопросом, "был он firstName или FirstName?" потому что Вы будете всегда знать, что необходимо ввести first_name. Предпочесть Camel-регистр? Тогда ограничьте себя этим, никакими дефисами или подчеркиваниями, и всегда, последовательно используйте или верхний регистр или нижний регистр для первого символа, не смешивайте их.

А теперь очень неясная проблема состояла в том что по крайней мере один браузер, Netscape 6, неправильно рассматриваемые идентификационные значения атрибута как чувствительные к регистру . Это означало, что, если Вы ввели id="firstName" в Вашем HTML (нижний регистр 'f') и #FirstName { color: red } в Вашем CSS (прописной 'F'), тот ошибочный браузер не выберет цвет элемента к красному. Во время этого редактирования, апрель 2015, я надеюсь, что Вас не просят поддерживать Netscape 6. Считайте это исторической сноской.

5
задан Georg Fritzsche 27 April 2010 в 11:17
поделиться

5 ответов

Your member function 'foo' needs a return type and you need to use the keyword 'template' when you use member templates in dependent expressions (expressions whose meanings rely directly or indirectly on a generic template parameter)

t_->template getMessageSender<MessageType>();  // ok
t_->getMessageSender<MessageType>(); // not ok

Perhaps this example will help you appreciate when a member template needs to be prefixed by the 'template' keyword [Note: in the interest of symmetry you may always use the 'template' prefix on member templates, but it is optional when used on a non-dependent expression.

struct MyType
{  
  template<class T> void foo() { }
};

template<class U>
struct S
{
  template<class T>
  void bar()
  {
    MyType mt;  // non-dependent on any template parameter
    mt.template foo<int>(); // ok
    mt.foo<int>();  // also ok

    // 't' is dependent on template parameter T
    T t;
    t.template foo<int>();    // ok
    t.foo<int>(); // not ok

    S<T> st; // 'st' is dependent on template parameter T
    st.template foo<int>();    // ok
    st.foo<int>(); // not ok


    S<MyType> s;  // non-dependent on any template parameter
    s.bar<int>(); // ok
    s.template bar<int>(); // also ok

  }

};

Hope that helps.

9
ответ дан 13 December 2019 в 19:33
поделиться

Добавьте ключевое слово шаблон между -> и имя метода шаблона:

t_->template getMessageSender<MessageType>();
2
ответ дан 13 December 2019 в 19:33
поделиться

Скорее всего, MessageType на тот момент неизвестен. Вам не хватает включения, разрешения пространства имен или объявления?

если это не так, как объявляется getMessageSender и как MessageType ?

Как правило, в C ++ это не проблема, если T не известен в этот момент (ну ... это сложно, но все же).

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

0
ответ дан 13 December 2019 в 19:33
поделиться

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

t_->getMessageSender<MessageType>();
0
ответ дан 13 December 2019 в 19:33
поделиться

It's just the return type of your function that's missing. The t_ member is fully defined.

A specialization of a template is a 'special' version your implement for specific template arguments. An example: std::vector is the specialized version of the generic std::vector.

A partial specialization is an implementation of your generic code where not all template arguments are provided.

0
ответ дан 13 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

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