Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Szablon + unresolved external symbol

Ostatnio zmodyfikowano 2012-01-08 21:20
Autor Wiadomość
TheSnake
Temat założony przez niniejszego użytkownika
Szablon + unresolved external symbol
» 2012-01-07 21:16:09
Witam, chciałbym użyć szablonów w swoim programie więc piszę w klasie deklaracje:
template < typename t > t ReadMemory2( DWORD address );
i definicję:
C/C++
template < typename t > t ReadMemory2( DWORD address )
{
    address = baseAddress + address;
    t ret;
    ReadProcessMemory( handle,( LPCVOID ) address, & ret, sizeof( t ), NULL );
    return ret;
}

Niestety linker(?!) wywala mi błąd:
error LNK2019: unresolved external symbol "public: char * __thiscall Controll::ReadMemory2<char *>(unsigned long)" (??$ReadMemory2@D@Controll@@QAEDK@Z) referenced in function "public: __thiscall MainWindow::MainWindow(void)" (??0MainWindow@@QAE@XZ)

Gdy próbuję wywołać funkcję:
Ctrl->ReadMemory2 < char *>( 0x43AE84 )

Dodam, że gdy nie ma tego szablonu w kodzie to kompiluje się normalnie. Gdy użyję zwykłej funkcji, która zwraca "char *" statycznie to działa. Używam VC2010.

Spotkał się ktoś z czymś takim?

Pozdrawiam.

@edit, doczytałem, że template powinien być w pliku nagłówkowym (całe ciało funkcji), tak też zrobiłem lecz nic się nie zmieniło.
P-47541
DejaVu
» 2012-01-07 23:09:17
C/C++
#include <windows.h>

class X
{
public:
    template < typename t >
    t ReadMemory2( DWORD address )
    {
        address = baseAddress + address;
        t ret;
        ReadProcessMemory( handle,( LPCVOID ) address, & ret, sizeof( t ), NULL );
        return ret;
    }
private:
    int baseAddress;
    HANDLE handle;
};

int main()
{
    X x;
    x.ReadMemory2 < char *>( 0x43AE84 );
    return 0;
}
Hm?
P-47551
TheSnake
Temat założony przez niniejszego użytkownika
» 2012-01-08 03:36:39
Dokładnie mam taką klasę (oczywiście, handle itp. pobieram). Przy statycznej funkcji zwracającej chara działa, a z szablonem nie chce. Przepisałem aplikację na wxWidgets i teraz przy tej funkcji wywala wyjątek "Access violation" w pliku strconv.cpp w liniach:
C/C++
const size_t len =::MultiByteToWideChar
(
m_CodePage, // code page
flags, // flags: fall on error
psz, // input string
- 1, // its length (NUL-terminated)
buf, // output string
buf ? n: 0 // size of output buffer
);

Z intem działa normalnie.
P-47557
DejaVu
» 2012-01-08 13:26:44
Access violation - naruszenie ochrony pamięci. W czym problem? System zachował się poprawnie, a ponadto aplikacja się skompilowała.
P-47569
TheSnake
Temat założony przez niniejszego użytkownika
» 2012-01-08 21:20:51
Faktycznie, okazało się, że tam miałem inny adres ;) Dzięki.
P-47661
« 1 »
  Strona 1 z 1