在不同函数中调用同一文件中的函数时出现 C2084 错误

C2084 error when calling function in same file in a diffrent function

所以,我正在尝试在 .h 文件中创建一个组合数学库。我有一个计算数字 n 的阶乘的函数,后跟一个函数(在同一文件中)使用阶乘函数计算 n 选择 k 的组合对于给定的 n 和 k。但是当我尝试编译代码时,它向我抛出这个错误:C2048 函数 'long factorial(int)' 已经有一个主体。 (我使用的是 VS 2015)

代码如下:

long int factorial(int n) // factorial of n
{
    int summation = n;
    for (int i = 1; i < n; i++)
    {
        summation *= i;
    }

    return summation;
}

double combination(int n, int k) // n choose k
{
    return (factorial(n) / (factorial(k) * factorial(n - k)));
}

double permutation(int n, int k) // n permutation k
{
    if (k != n)
        return (factorial(n) / factorial(n - k));
    else
        return factorial(n);
}

double repetitiveCombination(int n, int k) // repetitive combination of n choose k
{
    return combination(n - 1 + k, k);
}

double orderEquals(int n, int p) // order n objects of wich p are equal
{
    return (factorial(n) / factorial(p));
}

您提供的这段代码(或其中的一部分)在 header 中,并且您在两个 CPP 文件中包含了 header,因此出现错误。或者,错误地将 factorial 的实现放入两个源文件中。仔细看

So, I'm trying to make a combinatorics library in a .h file.

如果将非 class 成员实现放入头文件中,则需要在函数前加上 inline 关键字,例如:

   inline long int factorial(int n) // factorial of n
// ^^^^^^
   {
        int summation = n;
        for (int i = 1; i < n; i++)
        {
            summation *= i;
        }
        return summation;
  }

此外,将所有函数放入它们自己的命名空间也是一个好习惯。

很可能你没有 header 守卫。您的 header 应如下所示:

#ifndef MYHEADERNAME_H
#define MYHEADERNAME_H
// Your code is here
#endif //end of MYHEADERNAME_H

Wikipedia info here.