0

.inl ファイルの関数テンプレートの実装に問題があります (Visual C++)

私はヘッダーファイルにこれを持っています。

math.h ->>

#ifndef _MATH_H
#define _MATH_H
#include <math.h>

template<class REAL=float>
struct Math
{
     // inside this structure , there are a lot of functions , for example this..
     static REAL  sin ( REAL __x );
     static REAL  abs ( REAL __x );
};

#include "implementation.inl"     // include inl file
#endif

これが .inl ファイルです。

implementation.inl -->>

template<class REAL>
REAL Math<REAL>::sin (REAL __x)
{
    return (REAL) sin ( (double) __x );
}

template<class REAL>
REAL Math<REAL>::abs(REAL __x)
{
    if( __x < (REAL) 0 )
        return - __x;
    return __x;
}

正弦関数を呼び出すと、実行時にエラーが発生します。ただし、 abs 関数は正しく機能します。

問題は、.inl ファイル内のヘッダー math.h の関数の 1 つを呼び出すことだと思います

.inl ファイル内で math.h 関数を使用できないのはなぜですか?

4

1 に答える 1

2

この問題はファイルとは関係ありません。スタックがオーバーフローするまで再帰的に.inl呼び出すだけです。Math<REAL>::sin()MSVC 10 では、それを指摘する素晴らしい警告も表示されます。

warning C4717: 'Math<double>::sin' : recursive on all control paths, function will cause runtime stack overflow

試す:

 return (REAL) ::sin ( (double) __x ); // note the `::` operator

また、補足として、マクロ名_MATH_Hはコンパイラの実装で使用するために予約されています。多くの場合、実装で予約された識別子を使用すると、実際に競合が発生するのは不運です (ただし、そのような名前は避ける必要があります)。math.hただし、この場合、その名前は、複数回含まれないようにするために実際に使用されている名前と競合する可能性がかなり高くなります。

競合する可能性が低い別の名前を必ず選択する必要があります。C++ 識別子でのアンダースコアの使用に関する規則は何ですか? を参照してください。ルールのために。

于 2012-07-30T14:43:51.667 に答える