У меня есть код, который работает в VC9 (Microsoft Visual C++ 2 008 SP1), но не в GCC 4.2 (на Mac):
struct tag {};
template< typename T >
struct C
{
template< typename Tag >
void f( T ); // declaration only
template<>
inline void f< tag >( T ) {} // ERROR: explicit specialization in
}; // non-namespace scope 'structC<T>'
Я понимаю, что GCC хотел бы, чтобы я переместил свою явную специализацию вне класса, но я не могу выяснить синтаксис. Какие-либо идеи?
// the following is not correct syntax, what is?
template< typename T >
template<>
inline void C< T >::f< tag >( T ) {}
Вы не можете специализировать функцию участника без явного специализации, содержащего класс.
То, что вы можете сделать, тем не менее, являются переадресающими вызовами к члену функции частично специализированного типа:
template<class T, class Tag>
struct helper {
static void f(T);
};
template<class T>
struct helper<T, tag1> {
static void f(T) {}
};
template<class T>
struct C {
// ...
template<class Tag>
void foo(T t) {
helper<T, Tag>::f(t);
}
};
GCC находится в ясном, здесь. MSVC имеет нестандартное расширение, которое позволяет специализацию в классе. Стандарт, однако, говорит:
14.7.3.2:
2. Явная специализация должна быть объявлена в пространстве имен который шаблон является членом или, для членов шаблонов, в пространство имен которого является обложенным классом или обложенным классовым шаблоном член. Явная специализация функции участника, член Класс или статический элемент данных шаблона класса должен быть объявлен в пространство имен которого является членом шаблона класса.
Кроме того, вы не можете частично специализироваться на функцию. (Хотя я не уверен в деталях в вашем случае, это был бы последний удар.)
Вы могут сделать это:
#include <iostream>
struct true_type {};
struct false_type {};
template <typename T, typename U>
struct is_same : false_type
{
static const bool value = false;
};
template <typename T>
struct is_same<T, T> : true_type
{
static const bool value = true;
};
struct tag1 {};
struct tag2 {};
template< typename T >
struct C
{
typedef T t_type;
template< typename Tag >
void foo( t_type pX)
{
foo_detail( pX, is_same<Tag, tag1>() );
}
private:
void foo_detail( t_type, const true_type& )
{
std::cout << "In tag1 version." << std::endl;
}
void foo_detail( t_type, const false_type& )
{
std::cout << "In not tag1 version." << std::endl;
}
};
int main(void)
{
C<int> c;
c.foo<tag1>(int());
c.foo<tag2>(int());
c.foo<double>(int());
}
, хотя это несколько некрасиво.
Попробуйте это:
template <> template<typename T> inline void C<T> :: foo<tag2>(T) {}
Я использую приложение «Cherry Rplayer» для потоковой передачи на телефоне Android. Он позволяет выполнять потоковую передачу на пользовательские станции, а также выбирать что-либо из встроенных браузеров каталогов Shoutcast и Icecast. Вы также можете увидеть другие приложения от разработчиков, у них есть приложения для пользовательских ммс потоков и т.д.
-121--3202491-Посмотрите на этой странице о аудио, видео и потоковой передаче на Android.
Эти простые примеры были извлечены с этой страницы. Он создает экземпляр медиаплеера, устанавливает источник данных (местоположение потока) и запускает связь.
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE);
mp.prepare();
mp.start();
-121--3202490- Я знаю, что это может не удовлетворить вас, но я не верю, что у вас может не быть специализации, заключенной в неявно специализированную структуру.
template<>
template<>
inline void C< tag1 >::foo< tag2 >( t_type ) {}