0

我在 .inl 文件中的函数模板实现有问题(visual c++)

我在头文件中有这个。

数学.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 文件。

实施.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 的函数之一

为什么我不能在 .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 回答