[C++] Could not deduce template argument

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Ik heb wat matrix code die verschillende matrices terug geeft:

C++:
1
2
3
4
5
6
7
8
9
10
11
// namespace FS
template <typename T>
mat4<T> identity() {
    return mat4<T>(
            (T)1.0, (T)0.0, (T)0.0, (T)0.0,
            (T)0.0, (T)1.0, (T)0.0, (T)0.0,
            (T)0.0, (T)0.0, (T)1.0, (T)0.0,
            (T)0.0, (T)0.0, (T)0.0, (T)1.0
    );
}
typedef mat4<float> mat4f;


En nu heb ik een functie met een default argument:

C++:
1
void foo(const FS::mat4f& M = FS::identity<float>());

En daar krijg ik steeds de melding op "error C2783: 'FS::mat4<T> FS::identity(void)' : could not deduce template argument for 'T'"

Nu meen ik me te herinneren dat je bij zoiets het template keyword nodig had voor een correcte parse, maar

C++:
1
void foo(const FS::mat4f& M = FS::template identity<float>());

Geeft hetzelfde. Waarom snapt de compiler niet wat T is? Ik geef toch al expliciet op 'float'?

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:01
Gewoon een compiler bug misschien?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Die 'template' hoeft sowieso niet, dat geldt alleen voor dependent names in templates (net als 'typename'). De code is verder gewoon correct.

Quick'n'dirty fix:
C++:
1
2
3
mat4<float> identityFloat() { return identity<float>(); }
// ..
void foo(const FS::mat4f& M = FS::identityFloat());


Overigens compilet jouw code prima in VC++ 10.
.edit: en ook in VC++9. Compile je in C++/CLI modus ofzo?

[ Voor 14% gewijzigd door .oisyn op 20-01-2012 14:39 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

het template keyword is alleen nodig in een (andere) template aan te geven dat je het over een template hebt (daarbuiten is het volgens mij een syntaxis error zelfs), en foo is geen template, dus de 2e code is volgens mij sowieso fout :)

volgens mij is je code goed verder, welke compiler hebben we het over?

(en daarbuiten,heb je overwogen een library voor matrices te gebruiken, die gaan sneller zijn (platform-dependent optimizations zoals SSE of andere vectorization), en debugged, en vaak beter compilend op een bredere set compiler/platform, matrices zijn echt wel "uitgewoond" qua implementaties door mensen die een stuk meer tijd hebben geinvesteerd)

[ Voor 36% gewijzigd door MLM op 20-01-2012 14:40 ]

-niks-


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
.oisyn schreef op vrijdag 20 januari 2012 @ 14:35:
Die 'template' hoeft sowieso niet, dat geldt alleen voor dependent names in templates (net als 'typename'). De code is verder gewoon correct.
Ohja, klopt. Dacht ik probeer het :P
Overigens compilet jouw code prima in VC++ 10.
.edit: en ook in VC++9. Compile je in C++/CLI modus ofzo?
Ik weet het niet precies; ik gebruik VS2010 express in combinatie met qt-creator. Dit is de commandline:

Oh, je hebt gelijk, met GCC onder mingw compilet het foutloos. Vaag.
cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"..\..\..\..\Qt\4.8.0-vs2010\include\QtCore" -I"..\..\..\..\Qt\4.8.0-vs2010\include\QtGui" -I"..\..\..\..\Qt\4.8.0-vs2010\include\QtOpenGL" -I"..\..\..\..\Qt\4.8.0-vs2010\include" -I"..\..\..\..\Qt\4.8.0-vs2010\include\ActiveQt" -I"debug" -I"." -I"..\..\..\..\Qt\4.8.0-vs2010\mkspecs\win32-msvc2010" -Fodebug\ @C:\Users\Ferdi\AppData\Local\Temp\object.obj.2868.93.jom
object.cpp
MLM schreef op vrijdag 20 januari 2012 @ 14:36:
(en daarbuiten,heb je overwogen een library voor matrices te gebruiken, die gaan sneller zijn (platform-dependent optimizations zoals SSE of andere vectorization), en debugged, en vaak beter compilend op een bredere set compiler/platform, matrices zijn echt wel "uitgewoond" qua implementaties door mensen die een stuk meer tijd hebben geinvesteerd)
Ja ach, ik heb m'n eigen set geometry en opengl functies die ik door de jaren heen ontwikkeld heb. Ik vertrouw erop dat m'n compiler het redelijk optimized (hij maakt er ook sse code van). Indien het meer dan 10% cpu in gaat nemen optimize ik het wel met de hand, maar dat is nog nooit gebeurd. Ik wil ook niet steeds moeten linken met allemaal library troep die dan weer outdated is en dan weer niet werkt of aanwezig is op elk systeem.

Eigenlijk het enige dat ik als library altijd echt nodig heb is een goede, snelle, robuste Singular Value Decomposition. Dat is niet zo heel makkelijk om zelf even te schrijven. Daar gebruik ik op het moment alglib voor.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoijar schreef op vrijdag 20 januari 2012 @ 15:56:
Ik weet het niet precies; ik gebruik VS2010 express in combinatie met qt-creator. Dit is de commandline:
Ik zie daar geen rare dingen in staan. Krijg je het probleem ook met een geisoleerde testcase? Dit is wat ik gebruikte:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace FS {
    template<class T> struct mat4 { mat4(T); };

    template <typename T> 
    mat4<T> identity() { 
        return mat4<T>( 
            (T)1.0
            ); 
    } 
    typedef mat4<float> mat4f;
}


void foo(const FS::mat4f& M = FS::identity<float>()) { }

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
MLM schreef op vrijdag 20 januari 2012 @ 14:36:
het template keyword is alleen nodig in een (andere) template aan te geven dat je het over een template hebt (daarbuiten is het volgens mij een syntax error zelfs)
Die regel zat wel in C++'98 maar is later geschrapt (uit m'n hoofd in C++03).

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Uit de doos "vieze hacks" :
C++:
1
void foo(const FS::mat4f& M = (&FS::identity<float>)());

[ Voor 187% gewijzigd door MSalters op 20-01-2012 16:37 ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
.oisyn schreef op vrijdag 20 januari 2012 @ 16:17:
[...]

Ik zie daar geen rare dingen in staan. Krijg je het probleem ook met een geisoleerde testcase? Dit is wat ik gebruikte:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace FS {
    template<class T> struct mat4 { mat4(T); };

    template <typename T> 
    mat4<T> identity() { 
        return mat4<T>( 
            (T)1.0
            ); 
    } 
    typedef mat4<float> mat4f;
}


void foo(const FS::mat4f& M = FS::identity<float>()) { }
Dit geeft de error op foo() maar niet op bar():

C++:
1
2
3
4
5
6
7
8
9
10
11
12
namespace FS {
    template <typename T> struct mat4 {};
    template <typename T> mat4<T> identity() {return mat4<T>();}
}

struct X {
    void foo(const FS::mat4<float>& M = FS::identity<float>()) {}
};

void bar(const FS::mat4<float>& M = FS::identity<float>()) {}

int main(int argc, char *argv[]) {return 0;}


namespace FS weghalen fixed het vreemd genoeg ook...

(edit: typedef maakt niet uit, clutter)

[ Voor 7% gewijzigd door Zoijar op 20-01-2012 16:49 ]


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Gevalletje Koenig lookup?
Wikipedia: Argument-dependent name lookup

Shotgun debugging helpt wel eens bij zo'n dingen ;)

[ Voor 16% gewijzigd door H!GHGuY op 21-01-2012 10:15 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Zoijar schreef op vrijdag 20 januari 2012 @ 16:39:
[...]


Dit geeft de error op foo() maar niet op bar():

C++:
1
2
3
4
5
6
7
8
9
10
11
12
namespace FS {
    template <typename T> struct mat4 {};
    template <typename T> mat4<T> identity() {return mat4<T>();}
}

struct X {
    void foo(const FS::mat4<float>& M = FS::identity<float>()) {}
};

void bar(const FS::mat4<float>& M = FS::identity<float>()) {}

int main(int argc, char *argv[]) {return 0;}


namespace FS weghalen fixed het vreemd genoeg ook...

(edit: typedef maakt niet uit, clutter)
Tijd voor MS Connect dan :)

-niks-


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
MLM schreef op zaterdag 21 januari 2012 @ 13:08:
[...]


Tijd voor MS Connect dan :)
Ja, ik heb voor de zekerheid nog even Comeau geprobeerd (In strict mode, with -tused, Compile succeeded) dus ik file wel een bug report :)
Pagina: 1