LINUX.ORG.RU

[с++]Синтаксис вызова шаблонного метода шаблонного класса.

 


0

0

Сабж дополнение: вызов через ссылку на объект в обычной функции, т.е.:


#include <iostream>


template < class T >
struct TClass
{
	T t;
	
	template < int arg >
	void print_arg() { std::cout << arg << std::endl; }
	
	void test_print() { print_arg<1>(); }
};

template < class T >
void TFunc( TClass<T> & TC )
{
	//TC.print_arg<3>(); // line #18
}

int main( void )
{
	TClass < void* > TC;

	TC.test_print();   // print "1"

	TC.print_arg<2>(); // print "2"

	TFunc( TC );       // print "3" // line #30

	return 0;
}


Так всё прекрасно, но если разкомментировать вызов метода в функции TFunc, то компилер выплёвывает следующее:


ttest.cpp: In function ‘void TFunc(TClass<T>&)’:
ttest.cpp:18: error: expected primary-expression before ‘)’ token
ttest.cpp: In function ‘void TFunc(TClass<T>&) [with T = void*]’:
ttest.cpp:30:   instantiated from here
ttest.cpp:18: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘int’ to binary ‘operator<’

Т.е. здесь он почему-то пытается сравнить функцию с int'овым значением и при этом говорит что перегруженная функция не «разрешена», и как бы я не плясал со скобками и перемещениями шаблонного аргумента, так и не смог заставить его проглотить это. Знает кто-нибудь как это обойти и с чем всё это связано?

>с чем всё это связано

Различные

template < int arg >

void print_arg() { std::cout << arg << std::endl; }

Имеют одну и туже сигнатуру. Следовательно компилер не может их разлчить, о чем он тебе и сообщает

как это обойти

Передать int arg, как аргумент функции.

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

bind2cppman < Ничего себе! Прекрасно! Подскажите где об этом можно почитать? А то ни Александреску ни Страуструп («Язык программирования С++» и «Справочное руководство по С++») умалчивают о таких моментах.

P.S. Ничего не курю. :)

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

2whatfor, Вандервуд/Джосатис - Шаблоны C++ или в стандарте.

В принципе после этой книги читать Александреску не обязательно.

bind2cppman
()

Венгерская нотация... no way блин вот что автор курил, когда код таким образом оформлял?

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

Прежде всего благорадрю за книжку.

А на счёт оформления, то вышел перебор конечно. Хотел показать, что это шаблонные объекты и функции (Template Class -> TClass, ...), но здесь были объекТ и функциЯ, и можно было не распинаться, да.

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

>А то ни Александреску ни Страуструп («Язык программирования С++» и «Справочное руководство по С++») умалчивают о таких моментах.

ЕМНИП Страуструп пишет.

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