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)?

Author: stanigator, 2009-06-05

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.

 25
Author: Nikolai Fetissov,
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?

 21
Author: young,
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.

 4
Author: Ken Dyck,
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.

 3
Author: Stephen Nutt,
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.

 0
Author: grepsedawk,
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