Для [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. Считайте это исторической сноской.
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.
Добавьте ключевое слово шаблон
между ->
и имя метода шаблона:
t_->template getMessageSender<MessageType>();
Скорее всего, MessageType на тот момент неизвестен. Вам не хватает включения, разрешения пространства имен или объявления?
если это не так, как объявляется getMessageSender
и как MessageType
?
Как правило, в C ++ это не проблема, если T не известен в этот момент (ну ... это сложно, но все же).
Кроме того, сообщение об ошибке обычно содержит тип, для которого его пытаются создать. Постарайтесь опубликовать хотя бы полное сообщение об ошибке.
Есть ли у вас другие похожие вызовы методов, таких как getMessageSender, которые являются шаблонными?
t_->getMessageSender<MessageType>();
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.