Portál AbcLinuxu, 10. května 2025 02:24

Dotaz: Proč neprojde šablona

Jardík avatar 4.7.2009 19:55 Jardík | skóre: 40 | blog: jarda_bloguje
Proč neprojde šablona
Přečteno: 230×
Odpovědět | Admin
Může někdo poradit, proč mi neprochází toto:
/*
 * Callback function for color buttons' "color-set" signal
 */

template< void (FunctionWidget::*func)(const FunctionColor&) >
void MainWindow::ColorSetter(GtkColorButton* but, MainWindow* win)
{
	static GdkColor gc;
	static FunctionColor fc;
	
	gtk_color_button_get_color(but, &gc);
	fc.set(gc, gtk_color_button_get_alpha(but));
	
	FunctionWidget *w = win->function_widget;
	(w->*func)(fc);
}

/*
 * Create GtkColorButton which will automaticaly set function_widget color
 * using "func" when "color-set" signal is emited
 */

template< void (FunctionWidget::*func)(const FunctionColor&) >
GtkColorButton* MainWindow::createColorButton(const FunctionColor& color, MainWindow* mw)
{
	static GtkColorButton *result;
	static GdkColor gdk_color;
	static guint16 alpha;
	
	color.toGdkColor(gdk_color, alpha);
	result = (GtkColorButton*)gtk_color_button_new_with_color(&gdk_color);
	gtk_color_button_set_use_alpha(result, TRUE);
	gtk_color_button_set_alpha(result, alpha);
	g_signal_connect(G_OBJECT(result), "color-set", G_CALLBACK(ColorSetter<func>), (gpointer)mw); /* GfMainWindow.h:80 hlášený v chybě */
	
	return result;
}
Funkci volám takto:
createColorButton<&FunctionWidget::setBgColor>(
	function_widget->getBgColor(),
	this);
A kompilátor hlásí
src/GfMainWindow.h: In static member function ‘static GtkColorButton* Gf::MainWindow::createColorButton(const Gf::FunctionColor&, Gf::MainWindow*) [with void (Gf::FunctionWidget::* func)(const Gf::FunctionColor&) = &Gf::FunctionWidget::setBgColor]’:
src/GfMainWindow.cpp:97:   instantiated from here
src/GfMainWindow.h:80: error: insufficient contextual information to determine type
Podle mě má však informací dost :-)
Věřím v jednoho Boha.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

stativ avatar 5.7.2009 10:50 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: Proč neprojde šablona
Odpovědět | | Sbalit | Link | Blokovat | Admin
Možná jsem to nepochopil, ale jestli chceš dělat explicitní specializaci tak to má být
template <>
void MainWindow::ColorSetter<void (FunctionWidget::*func)(const FunctionColor&)> (GtkColorButton* but, MainWindow* win)
Tohle vypadá jako nějaký tvar před ANSI.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
stativ avatar 5.7.2009 11:00 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: Proč neprojde šablona
Jo už mi docvaklo, cos tím asi chtěl říci, takže můj předchozí post klidně ignoruj.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
Jardík avatar 5.7.2009 16:22 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Proč neprojde šablona
O specializaci se nejedná ... takže nevíš, kde je zakopanej pes?
Věřím v jednoho Boha.
Jardík avatar 5.7.2009 16:39 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Proč neprojde šablona
To mě po*er, jak je možný, že když udělám toto, tak to projde:
void (*setter)(GtkColorButton*,MainWindow*) = MainWindow::ColorSetter< func >;
g_signal_connect(G_OBJECT(result), "color-set", G_CALLBACK(setter), (gpointer)mw);
A když to nechám přímo v tom G_CALLBACK, tak to neprojde ...
Věřím v jednoho Boha.
stativ avatar 5.7.2009 17:18 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: Proč neprojde šablona
Popravdě jsem se ještě s takovým problémem nesetkal. Co se stane, když nejdřív provedeš explicitní konkretizaci pro tu funkci? Třeba když se to volá takhle z funkce tak k ní implicitně nedojde.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.