2011-01-24 87 views
1

這是引發錯誤的程序行:(S和u統計學家對象)鏈接器錯誤 - 朋友和左手邊。 (無模板)

s = 2*u; 

錯誤C2678:二進制「*」:沒有操作員發現這需要一個左類型 'INT' 的操作數(或沒有可接受的轉化率)

這是頭文件:

#ifndef STATISTICIAN 
#define STATISTICIAN 

namespace main_savitch_2C 
{ 
class statistician 
{ 
protected: 
    int _length; 
    double _mean, _minimum, _maximum; 

public: 
    statistician(); 
    statistician(int length, double mean, 
     double min, double max); 

    void next_number(double num); 
    void reset(); 
    int length() const; 
    double sum() const; 
    double mean() const; 
    double minimum() const; 
    double maximum() const; 

    friend statistician operator*(
     const statistician& a, double x); 
    //friend statistician operator*(
    // double x, const statistician& a); 
}; 

bool operator== (
    const statistician& a, 
    const statistician& b); 
statistician operator+ (
    const statistician& a, 
    const statistician& b); 
} 

#endif STATISTICIAN 

這是C++的文件:

#include "statistician.h" 
using namespace main_savitch_2C; 

statistician::statistician() 
{ 
    reset(); 
} 
statistician::statistician(int length, 
    double mean, double min, double max) 
{ 
    _length = length; 
    _mean = mean; 
    _minimum = min; 
    _maximum = max; 
} 

void statistician::next_number(double num) 
{ 
    _mean = (_mean * _length + num)/
     ++_length; 
    if (num < _minimum) _minimum = num; 
    if (num > _maximum) _maximum = num; 
} 
void statistician::reset() 
{ 
    _length = _mean = _minimum = 
     _maximum = 0; 
} 

int statistician::length() const 
{ 
    return _length; 
} 
double statistician::sum() const 
{ 
    return _mean * _length; 
} 
double statistician::mean() const 
{ 
    return _mean; 
} 
double statistician::minimum() const 
{ 
    return _minimum; 
} 
double statistician::maximum() const 
{ 
    return _maximum; 
} 

bool operator==(const statistician& a, 
    const statistician& b) 
{ 
    return (a.length()==b.length()) 
     && (a.mean()==b.mean()) 
     && (a.minimum()==b.minimum()) 
     && (a.maximum()==b.maximum()); 
} 
statistician operator+ (
    const statistician& a, 
    const statistician& b) 
{ 
    return statistician(
     a.length() + b.length(), 
     (a.sum() + b.sum())/
     (a.length() + b.length()), 
     (a.minimum() < b.minimum()) ? 
     a.minimum() : b.minimum(), 
     (a.maximum() > b.maximum()) ? 
     a.maximum() : b.maximum()); 
} 

statistician operator* (
    const statistician& a, double x) 
{ 
    return statistician(
     a.length() * x, 
     a.mean() * x, 
     a.minimum() * x, 
     a.maximum() * x); 
} 
//statistician operator* (double x, 
// const statistician& a) 
//{ 
// return statistician(
//  a.length() * x, 
//  a.mean() * x, 
//  a.minimum() * x, 
//  a.maximum() * x); 
//} 

當我取消的頭和實現兩家運營商,它提供了鏈接錯誤:

error LNK2019: unresolved external symbol "bool __cdecl main_savitch_2C::operator==(class main_savitch_2C::statistician const &,class main_savitch_2C::statistician const &)" ([email protected]@[email protected]@[email protected]) referenced in function "int __cdecl test3(void)" ([email protected]@YAHXZ) 
error LNK2019: unresolved external symbol "class main_savitch_2C::statistician __cdecl main_savitch_2C::operator+(class main_savitch_2C::statistician const &,class main_savitch_2C::statistician const &)" ([email protected]@[email protected]@[email protected]@Z) referenced in function "int __cdecl test3(void)" ([email protected]@YAHXZ) 
error LNK2019: unresolved external symbol "class main_savitch_2C::statistician __cdecl main_savitch_2C::operator*(double,class main_savitch_2C::statistician const &)" ([email protected]@[email protected]@[email protected]@Z) referenced in function "int __cdecl test4(void)" ([email protected]@YAHXZ) 
error LNK1120: 3 unresolved externals 

我無法找到任何東西,我想我已經嘗試了一切。我在Win 7 x64 Professional上使用VS 2010 x64 Professional。

+0

做一個乾淨的,然後完整的構建與操作方法uncommeted修復鏈接器問題? – ThomasMcLeod 2011-01-24 01:40:35

回答

5

看來你已經正確地認識到你需要在左側提供另一個超載。 (統計學家,雙重)op *超載不適用於(雙重統計學家)。

當我取消註釋頭和實現中的兩個運算符時,它會給出鏈接器錯誤。

您的項目設置配置錯誤,並且您沒有鏈接到定義這些的實現文件。或者,可能您的構建配置錯誤,無法識別您是否修改了這些文件,並且需要重新構建它們。 「清潔」/「全部重建」將暫時解決後一個問題。

我的第一個想法是錯誤的,問題是命名空間指令。實際執行文件中的實際操作是在另一個名稱空間中定義另一個運算符重載。這導致main_savitch_2C名稱空間中的重載未定義。而不是「使用名稱空間X」,將實現文件包裝在「namespace X {」和「}」中。

下面是一個演示問題的小例子。它包含在一個文件中,因此不會發生多TU鏈接問題。

namespace a { 
struct B {}; 
int operator+(B, int x); 
} 

using namespace a; 

int main() { 
    B() + 42; 
    return 0; 
} 

int operator+(B, int) { return 0; } 

如果最後一行已經上述主,在主表達式將是不明確的,這最清楚地示出了已經定義了一個單獨的操作者的過載:

example.cpp:8: error: ambiguous overload for ‘operator+’ in ‘a::B() + 42’ 
example.cpp:6: note: candidates are: int operator+(a::B, int) 
example.cpp:3: note:     int a::operator+(a::B, int) 

一般而言,應避免使用指令。 (使用指令是「using namespace X;」;使用聲明是「使用X :: name;」,這很好。)不過,指令是在局部函數範圍有用的(唯一的地方,我經常使用它們):

void example() { 
    using namespace std; // scoped to function 
    cout << "blah\n"; 
} 

順便說一句,這是我如何定義重載,假設* =有道理的統計學家的類型,當你使用*的方式使用時,它通常會這樣做:

struct statistician { 
    //... 

    statistician& operator*=(double x) { 
    // likely defined in implementation file, defined inline here for example 
    _length *= x; 
    _mean *= x; 
    _minimum *= x; 
    _maximum *= x; 
    return *this; 
    } 
}; 

// usually defined inline in the header 
inline 
statistician operator*(double a, statistician b) { 
    b *= a; 
    return b; 
} 
inline 
statistician operator*(statistician a, double b) { 
    a *= b; 
    return a; 
} 
+0

好,+1。 – ThomasMcLeod 2011-01-24 01:53:41