Шаблоны.. помогите разобраться..
От: alexsy Россия  
Дата: 06.06.08 07:55
Оценка:
Продолжаю изкчать.. шаблоны по книге "Вандевурд, Джосаттис — Шаблоны C++"
вот в стретил пример из книги..

#include <iostream>
#include <string>

template< typename Type >
class CIsClass {
    typedef char first;
    typedef struct { char dummu[ 2 ]; } second;
    template< typename TypeClass >
    static first test( int TypeClass::* ){ return first(); };
    template< typename TypeClass >
    static second test( ... ){ return second(); };
public:
    enum { Yes = sizeof( CIsClass<Type>::test<Type>(0) ) == 1 };
    enum { No = !Yes };
};
//*****************************************************************************
class CClass{
};
//*****************************************************************************
struct CStruct{
};
//*****************************************************************************
union CUnion{
};
//*****************************************************************************
void finc(){
}
//*****************************************************************************
enum E{ e1 } e;
//*****************************************************************************
//*****************************************************************************
template< typename Type >
std::string Check(){
    return CIsClass< Type >::Yes ? " It is Class." : " It is not Class.";
}
//*****************************************************************************
//*****************************************************************************
template< typename Type >
void CheckType( Type ){
    Check<Type>();
}
//*****************************************************************************
//*****************************************************************************
CStruct s;
int main() {
    // prints test_template_IsClass
    std::cout << "test_template_IsClass" << std::endl;
    std::cout << "int: " <<  Check< int >() << std::endl;
    return 0;
}


не компилит в строке enum { Yes = sizeof( CIsClass<Type>::test<Type>(0) ) == 1 }; говарит error: expected primary-expression before ‘>’ token
в чём дело?? Или тут чисто тиория..
Re: Шаблоны.. помогите разобраться..
От: jazzer Россия Skype: enerjazzer
Дата: 06.06.08 07:58
Оценка: 1 (1)
Здравствуйте, alexsy, Вы писали:

A>не компилит в строке enum { Yes = sizeof( CIsClass<Type>::template test<Type>(0) ) == 1 }; говарит error: expected primary-expression before ‘>’ token

A>в чём дело?? Или тут чисто тиория..

навскидку — попробуй поставить template (выделено)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Шаблоны.. помогите разобраться..
От: alexsy Россия  
Дата: 06.06.08 08:07
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, alexsy, Вы писали:


A>>не компилит в строке enum { Yes = sizeof( CIsClass<Type>::template test<Type>(0) ) == 1 }; говарит error: expected primary-expression before ‘>’ token

A>>в чём дело?? Или тут чисто тиория..

J>навскидку — попробуй поставить template (выделено)

спасибо..
Re: Шаблоны.. помогите разобраться..
От: rg45 СССР  
Дата: 06.06.08 14:58
Оценка:
Здравствуйте, alexsy, Вы писали:

A>Продолжаю изкчать.. шаблоны по книге "Вандевурд, Джосаттис — Шаблоны C++"

A>вот в стретил пример из книги..

A>
A>#include <iostream>
A>#include <string>

A>template< typename Type >
A>class CIsClass {
A>    typedef char first;
A>    typedef struct { char dummu[ 2 ]; } second;
A>    template< typename TypeClass >
A>    static first test( int TypeClass::* ){ return first(); };
A>    template< typename TypeClass >
A>    static second test( ... ){ return second(); };
A>public:
A>    enum { Yes = sizeof( CIsClass<Type>::test<Type>(0) ) == 1 };
A>    enum { No = !Yes };
A>};
A>


A>не компилит в строке enum { Yes = sizeof( CIsClass<Type>::test<Type>(0) ) == 1 }; говарит error: expected primary-expression before ‘>’ token

A>в чём дело?? Или тут чисто тиория..

Во-первых, точка с запятой после тел функций является лишней (в шаблонных функциях test).
Во-вторых, строчку, в которой возникает ошибка можно упростить:
enum { Yes = sizeof( test<Type>(0) ) == 1 };
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.