błąd linkera funkcji inline
Staram się używać wbudowanych funkcji Członkowskich danej klasy. Na przykład deklaracja funkcji i implementacja bez inliningu jest taka:
W pliku nagłówkowym:
int GetTplLSize();
W .plik cpp:
int NeedleUSsim::GetTplLSize()
{
return sampleDim[1];
}
Z jakiegoś powodu, jeśli umieszczę słowo kluczowe "inline" w jednej z implementacji i deklaracji, a także w obu miejscach, dostaję błędy linkera, jak pokazano:
Creating library C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.x and object C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.exp mexfunction.obj : error LNK2019: unresolved external symbol "public: int __thiscall NeedleUSsim::GetTplLSize(void)" (?GetTplLSize@NeedleUSsim@@QAEHXZ) referenced in function _mexFunction mexfunction.mexw32 : fatal error LNK1120: 1 unresolved externals C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL: Error: Link of 'mexfunction.mexw32' failed.
Co musi być aby pozbyć się tego błędu (tj. co robię źle w zakresie tworzenia tych funkcji inline member)?
5 answers
Musisz umieścić definicję funkcji w nagłówku. Najprostszym sposobem podpowiedzenia kompilatora do inline jest dołączenie ciała metody do deklaracji klasy, takiej jak:
class NeedleUSsim
{
// ...
int GetTplLSize() const { return sampleDim[1]; }
// ...
};
Lub, jeśli nalegasz na oddzielną deklarację i definicję:
class NeedleUSsim
{
// ...
int GetTplLSize() const;
// ...
};
inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }
Definicja musi być widoczna w każdej jednostce tłumaczeniowej, która używa tej metody.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-05 02:06:58
From C++ FAQ Lite
Jeśli umieścisz funkcję inline ' s definicja do a .plik cpp, a jeśli to nazywa się od jakiegoś innego .plik cpp, otrzymasz " nierozwiązane zewnętrzne" błąd z linkera.
Jak powiedzieć kompilatorowi, aby zrobił funkcję członkowską inline?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-15 11:15:32
Jak już zauważyli inni, musisz przenieść definicję funkcji inlined do pliku nagłówkowego, tak:
class NeedleUSsim
{
// ...
inline int GetTplLSize() { return sampleDim[1]; }
// ...
};
Powodem tego jest to, że kompilator musi wiedzieć, jaki kod do inline, gdy widzi wywołanie funkcji inline. Jeśli zostawisz definicję funkcji w .plik cpp dla klasy NeedleUSsim, kod generowany przez kompilator zostaje uwięziony w pliku obiektowym NeedleUSsim. Ponieważ kompilator czyta tylko kod źródłowy-nigdy zagląda do pliku obiektowego innej klasy-po prostu nie ma sposobu, aby wiedzieć, z jakim kodem zastąpić wywołanie, gdy kompiluje inne .plik cpp.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-05 01:00:24
Jeśli masz funkcję inline, powinieneś umieścić definicję w pliku nagłówkowym.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-05 00:09:02
Zobacz idiom Inline Guard Makro . Pozwoli to przynajmniej oddzielić, choć nieznacznie, Kod od deklaracji. Umożliwia również przełączanie inlining funkcji za pomocą define
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 04:21:05