Seite 1 von 1

function templates, overloads und default parameter

Verfasst: 30.07.2012, 17:29
von kaiserludi
Moin.

Code: Alles auswählen

class Foo
{
public:
	static void foo(int* param);
	template<typename FType1, typename FType2> static void foo(const FType1& param1, const FType2& vparam2=FType2());
};

Code: Alles auswählen

int main(void)
{
	Foo::foo(2);
}
-->

"error C2664: cannot convert parameter 1 from 'int' to 'int *'"

Wieso bemerkt der Compiler hier nicht, dass das ein Aufrug zum Template-Overload und nicht zum Non-Template-Overload ist und dass die parameter dank dem Defaultwert für param2 dort passen?
Wenn ich einen weiteren Overload template<typename FType> static void foo(const FType& param); hinzufüge, dann kommt der Compiler mit dem Aufruf klar. Eigentlich sollte er doch aber nun einen Disabiguation Fehler schmeißen, weil das erste Template mit defaultvalue die gleiche Signatur hat wie das 2.

Re: function templates, overloads und default parameter

Verfasst: 30.07.2012, 18:01
von CodingCat
kaiserludi hat geschrieben:Wieso bemerkt der Compiler hier nicht, dass das ein Aufrug zum Template-Overload und nicht zum Non-Template-Overload ist und dass die parameter dank dem Defaultwert für param2 dort passen?
Weil es kein Aufruf des Template-Overloads ist. Welchen Typ sollte er denn für FType2 deduzieren? ;)

Im Übrigen wird das Default-Argument nie in der Deduktion berücksichtigt, selbst wenn es einen unabhängigen Typ hat. Ab C++11 kannst du für FType2 immerhin einen Default-Typen angeben.

Re: function templates, overloads und default parameter

Verfasst: 30.07.2012, 18:19
von kaiserludi
CodingCat hat geschrieben:Welchen Typ sollte er denn für FType2 deduzieren? ;)
Stimmt, das ist ein Argument.