Я помещаю превосходный ответ 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 только в объявлениях шаблонов и определениях, приведенных ниже.
blockquote>у вас есть квалифицированное имя, которое относится к типу и зависит от параметра шаблона.
при выполнении.NET 2.0 или выше можно использовать ServiceBase. Остановитесь для остановки сервиса от OnStart. Иначе назовите Остановку от нового потока.
<забастовка> касательно [devnewsgroups] ( http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx ) забастовка>
(группа новостей, которую уводят)
Переместите всю свою логику запуска к отдельному методу, и Выдайте исключения (или назовите OnStop) из того отдельного метода.
OnStart имеет некоторые причуды при запуске. Я нашел что, если OnStart () имеет не больше, чем одну строку в нем, то я не получаю "Запущенный сервис и затем остановленный. Некоторые сервисы останавливаются автоматически, если у них нет работы, чтобы сделать" сообщение, и вызванные исключительные ситуации завершат процесс и журнал к журналу событий приложения.
Также с отдельным методом запуска, можно использовать технику как это для отладки его без присоединения. http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx