2016-05-28 26 views
-2

所以,我试图在.h文件中创建一个组合库。我有一个计算n的阶乘的函数,后面跟着一个函数(在同一个文件中),它使用阶乘函数来计算n的组合,选择给定的n和k的k。但是当我尝试编译代码时,它会向我引发这个错误:C2048函数'long factorial(int)'已经有一个body。 (我使用VS 2015年)C2084在不同功能的同一文件中调用函数时出错

下面的代码:

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)); 
} 
+3

无法重现。你有没有尝试创建[mcve]呢? – user2079303

+1

有几件事情可能会导致这种情况。但不要让我们猜测。这不是提问的有效方法。你如何使用这段代码?它是在头文件还是代码文件中?你是否#包括它?如果是这样,如何和在哪里?就像其他人说的那样,重现问题的最低限度的例子将是一个好的开始。 –

回答

0

很可能你没有标头警卫。你的头应该是这样的:

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

Wikipedia info here.

+0

不,最有可能缺失的标题卫兵不必解决问题。 –

+0

谢谢你解决了这个问题! – CGRaul

0

此代码,您提出(或它的一部分)是在标题,你是包括两个CPP文件头,因此错误。或者,错误地将factorial的实现分为两个源文件。仔细地看。

1

所以,我试图在.h文件中创建一个combinatorics库。

如果你把非类成员实现成一个头文件,你需要用inline关键字如前缀的功能:

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

而且这将是把好习惯所有的函数到他们自己的名字空间。

相关问题