Avatar billede kamikaze Nybegynder
03. april 2004 - 21:01 Der er 20 kommentarer

template member functions

Hej.

Jeg har et problem med at lave en member function som en template. Flg. er eksempel på hvad jeg gør:


class AClass;

class MyClass
{
public:
  ...
  template<class T> T& MyMethod() { ... }
  ...
};


class AClass
{
public:
  ...
  MyClass* pMyClass;
  ...
};


...
MyClass* pMyClass;
pMyClass->MyMethod<AClass>();
...

giver flg. kompiler fejl:
error C2275: 'AClass' : illegal use of this type as an expression


Hvad gør jeg forkert???
Avatar billede arne_v Ekspert
03. april 2004 - 21:21 #1
Nu kna jeg ikke huske de snørklede syntaxer, men et gæt ville være:

template<class T> T& MyMethod<T>() { ... }
Avatar billede kamikaze Nybegynder
03. april 2004 - 21:27 #2
Ups:

syntax error : missing ';' before '<'
+ 31 andre fejl

Narj, tror ikke det er sådan :o)
Avatar billede kamikaze Nybegynder
03. april 2004 - 21:30 #3
Hmmmmm....

Har lige fundet ud af at det er flg. linie der fejler:
SmartPtr<Component> comp = obj->FindComponent<Component>();

Den kompilerer fint ved udkommentering, så måske kalder jeg forkert?
Avatar billede kamikaze Nybegynder
03. april 2004 - 21:33 #4
Tilføjelse: i ovenstående er 'obj->FindComponents()' = 'MyClass->MyMethod()' i eks. fra før, bortset fra SmartPtr (som er grundigt gennemtestet og brugt før).
Avatar billede arne_v Ekspert
03. april 2004 - 21:35 #5
Hvilken compiler bruger du ?
Avatar billede kamikaze Nybegynder
03. april 2004 - 21:36 #6
m$vc 6.0
windows 2k/dx9
Avatar billede arne_v Ekspert
03. april 2004 - 21:39 #7
:-(

C:\>type temp.cpp
#include <iostream>

using namespace std;

class C
{
  private:
      int data;
  public:
      C(int data) { this->data = data; };
      template<class T> T Get() { return (T)data; };
};

int main()
{
  C c(65);
  cout << c.Get<int>() << endl;
  cout << c.Get<char>() << endl;
  return 0;
}

C:\>g++ -v
Reading specs from C:/mingw/bin/../lib/gcc-lib/mingw32/3.1/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=
mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable
-languages=f77,c++,objc,ada --disable-win32-registry --disable-shared
Thread model: win32
gcc version 3.1

C:\>g++ temp.cpp -o temp.exe

C:\>temp
65
A

C:\>bcc32 temp.cpp
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
temp.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\>temp
65
A

C:\>cl /GX temp.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

temp.cpp
temp.cpp(17) : error C2679: binary '<<' : no operator defined which takes a righ
t-hand operand of type '' (or there is no acceptable conversion)
temp.cpp(17) : error C2062: type 'int' unexpected
temp.cpp(18) : error C2679: binary '<<' : no operator defined which takes a righ
t-hand operand of type '' (or there is no acceptable conversion)
temp.cpp(18) : error C2062: type 'char' unexpected
Avatar billede kamikaze Nybegynder
03. april 2004 - 21:50 #8
Hm. Ser ikke så godt ud for msvc :o(

Hvad får du ud af det?
Avatar billede kamikaze Nybegynder
03. april 2004 - 21:51 #9
altså:

temp.cpp(17) : error C2679: binary '<<' : no operator defined which takes a righ
t-hand operand of type '' (or there is no acceptable conversion)
temp.cpp(17) : error C2062: type 'int' unexpected
temp.cpp(18) : error C2679: binary '<<' : no operator defined which takes a righ
t-hand operand of type '' (or there is no acceptable conversion)
temp.cpp(18) : error C2062: type 'char' unexpected
Avatar billede arne_v Ekspert
03. april 2004 - 21:53 #10
At MS VC++ har en lille bug med hensyn til template metoder.
Avatar billede arne_v Ekspert
03. april 2004 - 21:54 #11
Nu er hverken min kode eller min fejl besked helt magen til din.

Men det rejser jo tvivl om hvorvidt MS VC++ kan gøre det du gerne vil.
Avatar billede kamikaze Nybegynder
03. april 2004 - 21:56 #12
Nej....det må ikke være rigtigt.....

Tror liiiiige jeg tjekker ms.com for update a vc....og ber en stille bøn :o)
Avatar billede arne_v Ekspert
03. april 2004 - 21:59 #13
MS VC++ 6 er efterhånden en ældre sag.

Jeg er på SP5.

Men jeg har lige set at der er en SP6.

Måske er du heldig.
Avatar billede kamikaze Nybegynder
03. april 2004 - 21:59 #14
Ok, 216 kb/sec....det er under 10 min.
Avatar billede arne_v Ekspert
03. april 2004 - 22:00 #15
Ellers må du finde en anden løsning.

Man jo kunne kode i C++ i mange år uden templates.
Avatar billede kamikaze Nybegynder
03. april 2004 - 22:07 #16
tja...man kunne. Jeg kan ikke lige nu - måske imorgen :o)
Avatar billede kamikaze Nybegynder
03. april 2004 - 22:17 #17
nope :o(

Det hjalp ikke.

Jeg tror jeg arbejder videre på et andet subsystem lige nu. Er for nede over det her kl. 22.16 en lørdag :o(
Avatar billede arne_v Ekspert
24. april 2004 - 18:05 #18
Skal vi have afsluttet spørgsmålet ?
Avatar billede kamikaze Nybegynder
26. april 2004 - 22:16 #19
Fik ikke løst det som jeg ønskede fra start, men fik lavet en generisk template iterator og et lille hack, så det virker efter hensigten.

Arne_v > smid et svar - det er i den grad fortjent :o)
Avatar billede arne_v Ekspert
26. april 2004 - 22:18 #20
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester