Ответ на первый вопрос
Скажем, у вас есть:
struct Foo
{
template <typeename T>
T bar() { return T{}; }
template <typeename T>
T baz(T t) { return 2*t; }
};
Чтобы использовать Foo::bar
, вам необходимо предоставить параметр шаблона.
Foo foo;
foo.bar<int>(); // OK.
foo.bar(); // Not OK.
Если параметр шаблона может быть выведен из аргументов, то вам не нужно явно указывать параметр шаблона.
foo.baz<int>(10); // OK. Template parameter is explicity.
foo.bar(10); // Also OK. Template parameter is deduced to be int
Ответ на второй вопрос
EthernetProxy
представляется следующимшаблон класса с параметром шаблона по умолчанию.Скажем, у вас есть:
template <typename T = int> struct EthernetProxy { ... };
EthernetProxy
это не класс, это шаблон класса.Установкой шаблона класса будет класс.
EthernetProxy<double> var1; // OK
EthernetProxy<> var2; // Also OK. The default template parameter int is used.
Вот почему вы можете использовать EthernetProxy<>
как тип, но не EthernetProxy
.