views:

1016

answers:

5

I am trying to use inline member functions of a particular class. For example the function declaration and implementation without inlining is as such:

in the header file:

int GetTplLSize();

in the .cpp file:

int NeedleUSsim::GetTplLSize()
{
    return sampleDim[1];
}

For some reason if I put the "inline" keyword in either one of the implementation and declaration, as well as in both places, I get linker errors as shown:

 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. 

What needs to be in order to get rid of this error (i.e. what am I doing wrong in terms of making these inline member functions)?

+1  A: 

If you have an inline function you should put the definition in the header file.

Stephen Nutt
I tried putting the inline keyword on the definitions in the header file and I still get the same linker error.
stanigator
Not just the inline keyword, the whole definition should go in the header file. So, move it from your .cpp file into your .h file.
ChrisInEdmonton
Definition, not declaration.
Ed Swangren
+6  A: 

You need to put function definition into the header then. The simplest way to hint the compiler to inline is to include method body in the class declaration like:


class NeedleUSsim
{
  // ...
  int GetTplLSize() const { return sampleDim[1]; }
  // ...
};

or, if you insist on separate declaration and definition:


class NeedleUSsim
{
  // ...
  int GetTplLSize() const;
  // ...
};

inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }

The definition has to be visible in each translation unit that uses that method.

Nikolai N Fetissov
Is this the only way? (I want to separate the declaration and implementation separately for readability reasons)
stanigator
Basically yes. The compiler has to know the body of the function while compiling the calls to it, so the body has to be in the included header file.However, you could still just declare the function in the class declaration and add the implementation at a later place in the header file.
Hans
I see. I guess I would just have to live with writing the code this way then. Thanks for the advices.
stanigator
Some people like to put inline functions in a separate header file and include that from the main header file (at the end) instead of having them in the main header. I'm not personally 100% convinced by it (it feels like a waste of time to me) but if you like it, it's another option.
markh44
Yes, I didn't want to mention that .inl pathetic technique :)
Nikolai N Fetissov
+2  A: 

from C++ FAQ Lite

If you put the inline function's definition into a .cpp file, and if it is called from some other .cpp file, you'll get an "unresolved external" error from the linker.

How do you tell the compiler to make a member function inline?

young
+1  A: 
Ken Dyck
A: 

See the Inline Guard Macro idiom. This will at least allow you to separate, albeit slightly, the code from the declaration. It also allows you to toggle inlining of functions via a define. This is in response to your comment "I guess I would just have to live with writing the code this way then" :)

http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Inline_Guard_Macro

grepsedawk