Perhaps in another situation, but in the case I didn't define anything. The macro was defined in NSObjRuntime which I presume is brought in by my precompiled header. It might actually be easier to redefine the template in all the numerical recipes. :-)

On 11-Sep-08, at 5:24 PM, Clark Cox wrote:

You may want to consider using std::max from the C++ standard library
instead of defining your own such function.

On Thu, Sep 11, 2008 at 5:03 PM, Robert Douglas <[EMAIL PROTECTED]> wrote:
Thanks Johnathan. That was the problem, and #undef worked like a charm. I also had a look at the preprocessor output as Scott suggested and the lines
had been converted to gobbledygook.
Rob

On 11-Sep-08, at 4:42 PM, Jonathan Prescott wrote:

You might want to take a look at the other header files you might be
including, including those included by the AppKit or other Apple headers. MAX is a well-known MACRO definition for providing a max "function" for C (and Objective-C) environments, and, if it is being expanded by the C/C++ pre-processor (because the macro is defined in some other header file from the C-domain like stdlib.h or stdio.h, or something to that effect), the
resulting C/C++ code is going to be very confusing to the compiler.

In C-land, and Objective-C land,  MAX is typically defined as :

# define MAX(x,y) ((x) > (y) ? (x) : (y))

in one or more of the stdxxx.h header files (or some other header file,
it's really all over the place!).  The "MAX(x,y)" is replaced by the
expression on the right whenever the MAX(...) is seen, including in your template definition. Which means the compiler is attempting to compile:

template<class T>
inline const T& ((const T& a) > (const T& b) ? (const T&a) : (const T&b))
(const T& a, const T& b) { ... }

which is utter nonsense to the C++ compiler (or Objective-C++ compiler).

You might want to 1) rename your MAX template function to "max" or
"max_of", or "Max", or something other than MAX all caps; or 2) put
something like

#if defined(MAX)
#  undef MAX
#endif

before:

template<class T>
inline const T& MAX(....) { ... }

Macro definitions do not follow anything like C++ overloading rules,
scoping, etc.. They are simply text substitutions, which is why what actually gets presented to the C++ compiler/Objective-C++ compiler (really, the same animal) is going to be some funny text sequences that do not make
sense.

Note that the same holds true for MIN. One should note that SQR is NOT
defined in stdxxx.h, which is why there is not a name collision.

Jonathan

On Sep 11, 2008, at 6:51 PM, Robert Douglas wrote:

I'm in the same boat. Is the C++ code handled the same in both? I've been trying to add some numerical recipes routines to my cocoa app and I'm stymied by an apparent difference. The nr3.h header compiles fine if I have
it in a .cpp file, but not when it is in a .mm one.    The  line
template<class T>
inline const T &MAX(const T &a, const T &b)
    {return b > a ? (b) : (a);}

gives me these compile errors:

error: expected unqualified-id before '{' token
error: expected `)' before '{' token
error: invalid function declaration
error: expected unqualified-id before ')' token
etc.

Curiously, some other nearby lines compile fine.  eg.
template<class T>
inline T SQR(const T a) {return a*a;}

Any suggestions?
Thanks,
Rob

On 11-Sep-08, at 2:15 PM, Randy Bradley wrote:


The ".mm" extension is required for source that contains both C+ + and
Objective-C, thus called Objective-C++.  Not required for pure C++
source.

A couple ideas:

1. Be sure to add the C++ source files to your target. (ie, look for
the
checkmark in the target column)
2. Any objective-c source that creates C++ declared objects also must
have
the ".mm" extension and must include the C++ header files.



I'm relatively new programming ObjectiveC and Cocoa, and I'm trying to
add
some C++ code to my existing ObjectiveC/Cocoa code using Xcode 3.1. I
have my
C++ files in a separate .mm files (as the documentation says to), and
my C++
headers are in a xxx.h file. When building the code, I keep getting my
C++
'class' and everything associated with it as undefines.

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/rdouglas %40mac.com

This email sent to [EMAIL PROTECTED]

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

http://lists.apple.com/mailman/options/cocoa-dev/jprescott12%40comcast.net

This email sent to [EMAIL PROTECTED]


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/ clarkcox3%40gmail.com

This email sent to [EMAIL PROTECTED]




--
Clark S. Cox III
[EMAIL PROTECTED]

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to