LINUX.ORG.RU

C++ templates


0

0

$ cat test.cpp
template<typename T>
class test{
public:
typedef unsigned T unsig;
};
int main(){
test<int>::unsig var=0;
return 0;
}
$ g++ test.cpp -o test
test.cpp:4: error: invalid combination of multiple type-specifiers
test.cpp: In function ‘int main()’:
test.cpp:8: error: ‘unsig’ is not a member of ‘test<int>’
test.cpp:8: error: expected `;' before ‘var’

Пример совершенно безумный, да. Вопрос в том, как добраться до типа, определенного в темплейтном классе.

★★★★★

> typedef unsigned T unsig;

разве так можно? T уже тип, а unsigned - не квалификатор.

mqspi
()

Если убрать unsigned в typedef, то соберется без ошибок. По моему шаблонный тип в typedef с модификаторами использовать нельзя, то есть допустимо только 'typedef T type' и 'typedef T* ptype'.

plambir
()
Ответ на: комментарий от Absurd

Хочу внести некоторую ясность:). Unsigned тут совершенно ни причем, пример плохой, да. Проблема в том, чтобы добраться до typedef-типа, описанного в темплейтном классе. В typedef используется сам шаблонный тип. Реальная проблема возникла в определении типа указателя-на-метод
typedef void(T::*method_t)();
Причем этот тип отлично видится внутри самого класса, но не получается до него добраться извне.

staseg ★★★★★
() автор топика
Ответ на: комментарий от staseg

Две самых упоротых вещи в С++ - видимость typedef-а внутри шаблона и указатели на метод.

если повезет то сработает наверно это:

typename Template<T>::Type BoZo;

Судя по всему суть этого заклинания в том чтобы вытащить тип Type из шаблона Template, инстанциированного типом T в текущий scope и дать имя "BoZo" этому типу.

Указателями на методы лучше вообще не пользоваться, попробуй чистые виртуальные функции вместо них использовать.

Absurd ★★★
()
Ответ на: комментарий от staseg

Ты сразу код приводи близкий к проблеме, т.к. в топике кроме unsigned проблем нет.

tzukko
()
Ответ на: комментарий от Absurd

Thanks 2 Absurd.

У всех прошу порщения за кривой вопрос/пример.

staseg ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.