2010-11-08 65 views
2

當我試圖獨立非成員重載運營商的聲明和實現,我得到了一個VC2010 LNK2001錯誤,我的代碼是這樣的:運算符在類之外重載!

-foo.h-

class A 
{ 
public: 
    A(float x); 
    float x; 
}; 
A operator +(const A&, const A&); 

-foo.cpp-

A::A(float x) 
{ 
    this->x = x; 
} 

A operator +(const A& lh, const A& rh) 
{ 
    return A(lh.x + rh.x); 
} 

所以一旦我使用「+」操作,錯誤泵出,但如果我在頭文件中刪除該聲明,沒有LNK2001錯誤..我想不通爲什麼..

+0

你使用任何命名空間? – 2010-11-08 03:57:19

+0

是的,我用我自己定義的命名空間 – Alan 2010-11-08 04:01:42

+0

下次給出確切的錯誤信息。但是這個命名空間正在創造這個問題。看到我的答案。 – 2010-11-08 04:02:29

回答

5

我懷疑你有不同的聲明空間的定義比聲明。 ADL正在查找該聲明(因爲它與該類位於相同的名稱空間中),並且在鏈接期間您將收到無法解析的外部錯誤。

例如

-foo.h-

namespace aspace 
{ 
    class A 
    { 
    public: 
     A(float x); 
     float x; 
    }; 
    A operator +(const A&, const A&); 
} 

-foo.cpp-

#include "foo.h" 
using namespace aspace; 

A::A(float x) 
{ 
    this->x = x; 
} 

A operator +(const A& lh, const A& rh) 
{ 
    return A(lh.x + rh.x); 
} 

會給你描述的錯誤。解決的辦法是把operator+定義正確的命名空間:

namespace aspace 
{ 
    A operator +(const A& lh, const A& rh) 
    { 
     return A(lh.x + rh.x); 
    } 
} 
+0

嗨,本,這正如你所說,我現在明白了,非常感謝你! – Alan 2010-11-08 04:06:06

+0

@Alan:由於您是本網站的新手,因此您可能沒有注意到我的答案左側是複選標記的灰色輪廓。如果你點擊它,它會讓我的答案「接受」,這給了我點,並讓其他人知道這個問題是正確的答案。你也應該「接受」你的其他問題的正確答案。 – 2010-11-08 04:22:22

+0

@Alan:作爲一般規則,從工具箱中刪除'using namespace'。我知道很多書籍/教程使用它,但它帶來的麻煩比它的價值更大。如果名稱空間別名過於笨拙,請考慮命名空間別名。 – 2010-11-08 08:03:30

0

我看不出您提供的代碼有任何問題。

你確定這是你的代碼嗎?

如果是這樣,那麼它似乎唯一的解釋是,你有不知何故設法在你的Visual Studio項目中沒有[foo.cpp],假設你正在使用Visual Studio。

如果使用命令行工具,相應的東西將不包括[foo.obj]。

如果這些評論沒有幫助,你可以創建一個單一文件的小程序,展現出這個問題嗎?

乾杯,

0

原型更改爲(如果你堅持保留操作的定義+在封閉命名空間無論出於何種原因)

A aspace::operator +(const A& lh, const A& rh)