Portál AbcLinuxu, 14. května 2025 04:00

Dotaz: c++ šablonová funkce není nalezena?

4.5.2010 08:32 vencas | skóre: 32
c++ šablonová funkce není nalezena?
Přečteno: 215×
Odpovědět | Admin
Zdravím,

kompilátor ignoruje šablonovou funkci, kterou by měl (podle mě) použít a nevím si už rady. Kód vypadá zhruba tímto způsobem (bohužel to musí být složité):
using std::max;
typedef double Real;
// obezlička na template alias (ano, vím že je v c++0x, ale gcc neumí)
template<typename Scalar> struct Vector3{ typedef Matrix<Scalar,3,1> type; };
typedef Vector3<Real>::type Vector3r;
// funkce
// argumenty byly původně const, ale nemá to vliv na výsledek
template<typename Scalar> typename Vector3<Scalar>::type componentMaxVector(typename Vector3<Scalar>::type& a, typename Vector3<Scalar>::type& b){ return typename Vector3<Scalar>::type(max(a.x(),b.x()),max(a.y(),b.y()),max(a.z(),b.z()));}
Normálně to funguje, až na to, že v kódu:
Vector3r a,b,c;
// přiřazení do a,b
c=componentMaxVector(a,b);
kde by se měla podle mě zavolat šablonová funkce se Scalar=Real (tedy Vector3<Scalar>::type=Vector3r) mi g++ (4.4 i 4.5) nadává:
error: no matching function for call to 'componentMaxVector(Vector3r&, Vector3r&)'
Dokáže někdo vysvětlit, proč g++ tu šablonu nevidí?

Díky.

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Josef Kufner avatar 4.5.2010 08:42 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: c++ šablonová funkce není nalezena?
Odpovědět | | Sbalit | Link | Blokovat | Admin
A máš tu šablonovou funkci celou v hlavičkovém souboru? Ono C++ má takovou drobnou chybu v návrhu...
Hello world ! Segmentation fault (core dumped)
4.5.2010 10:08 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: c++ šablonová funkce není nalezena?
Odpovědět | | Sbalit | Link | Blokovat | Admin

Kdyz mate funkci deklarovanou takhle, tak vam c++ argumenty nevydedukuje. Ale takhle to pujde:

template<typename Scalar>
Matrix<Scalar, 3, 1> componentMaxVector(const Matrix<Scalar, 3, 1>& a, const Matrix<Scalar, 3, 1>& b)
{
	return typename Vector3<Scalar>::type(max(a.x(),b.x()), max(a.y(),b.y()), max(a.z(),b.z()));
}
4.5.2010 10:32 vencas | skóre: 32
Rozbalit Rozbalit vše Re: c++ šablonová funkce není nalezena?
Díky, vyzkouším. Ale proč? Vždyť je to typedef...
4.5.2010 11:18 vencas | skóre: 32
Rozbalit Rozbalit vše Re: c++ šablonová funkce není nalezena?
Potvrzeno, funguje. Ale nechápu...
4.5.2010 12:30 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: c++ šablonová funkce není nalezena?
Prave kvuli tomu typedefu, parametry sablony podle vnoreneho typu dedukovat nelze. Vizte standard, nebo treba tohle.
4.5.2010 13:00 vencas | skóre: 32
Rozbalit Rozbalit vše Re: c++ šablonová funkce není nalezena?
Bezva, díky moc.

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.