2017-10-12 64 views
1

我最近開始使用C++和opencv進行圖像處理。自從開始幾乎每個示例代碼都使用了namespace std;在標題中。在閱讀完它後,我發現建議不要使用名稱空間,因爲當兩個庫具有相同的函數名稱時,它可能會導致問題。所以我決定不再使用命名空間,但現在應該何時添加std ::或cv ::?

所以我改變它,並使用cv ::和std ::每當我得到一個錯誤,但仍然有函數從opencv沒有錯誤我假設這是因爲只有一個函數與該名稱。但是我應該爲每個函數添加標識符,即使這不會導致錯誤?

例如

cv::Mat antif; 
idft(complexI, antif); 
split(antif, planes); 
magnitude(planes[0], planes[1], antif); 
normalize(antif, antif, 0, 1, cv::NORM_MINMAX); 

我測量使用傅立葉變換的兩個圖像之間的相位差。 我必須添加cv ::製作變量antif時。但opencv中包含的以下任何函數都不會彈出錯誤消息。

這是因爲這個問題只有一個實例,或者我應該添加cv ::只是爲了習慣這樣做?

+1

是一致的。要麼使用命名空間標準; cv或std :: cv ::在名稱空間中的每個標識符之前。 –

+0

編寫代碼,以便人們可以輕鬆理解。對我來說,這意味着命名空間限定了所有的功能,因爲我很快就會看到它們屬於哪個庫。 –

+0

一般來說,在''cpp''模塊中使用'namespace''語句是很好的。它將它們放在頭文件中,這是一個真正的禁忌。你也可以在你的''cpp''中使用''''''''''使用cv :: Mat;'''來做東西,然後在你的源代碼中保存'Mat''。 –

回答

2

ADL已在另一個答案中提及。

下面是它如何工作的:

在下面的例子中,注意功能show已在命名空間FooBar定義。

ADL允許編譯器查看參數列表中提到的所有命名空間。

X1是Foo::X所以在第一次調用show()下面的命名空間可以檢查:

  • ::(全局命名空間)
  • 任何命名空間被拉入美孚與使用命名空間
  • 任何命名空間都被拉入全局命名空間,並帶有using namespace(這就是爲什麼我們不在全局命名空間中使用using namespace

 

#include <iostream> 

namespace Foo 
{ 
    struct X{}; 
    void show(X const&) 
    { 
     std::cout << "a Foo::X" << std::endl; 
    } 
} 

namespace Bar 
{ 
    struct X{}; 
    void show(X const&) 
    { 
     std::cout << "a Bar::X" << std::endl; 
    } 
} 

int main() 
{ 
    auto x1 = Foo::X(); 
    auto x2 = Bar::X(); 

    show(x1); 
    show(x2); 
} 

預期輸出:

a Foo::X 
a Bar::X 
+0

我不知道如何搜索它。所以ADL讓編譯器檢入命名空間。當我刪除'使用命名空間cv';大多數錯誤都是聲明,所以ADL在那裏不起作用。所以那些沒有錯誤的函數是ADL可以很容易地找到它們的命名空間的函數?如果是的話,我應該添加'cv ::'以避免添加更多庫時出現問題? –

+0

@FabricioGomez聲明你需要添加cv ::。執行函數查找時,ADL可用於模板擴展。但是,如果您知道您需要cv :: version,則明確指定cv ::時不會有任何傷害。 –

2

這些功能可以通過argument-dependent lookup找到。因此,它們位於cv命名空間中,但是編譯器能夠猜測出這是因爲(至少)其中一個參數的類型位於cv命名空間中。

+0

我不會稱之爲「猜測」 –

+0

這是口語肯定的,但我鏈接到的文章解釋了它是如何工作的非常詳細。 –

+1

「演繹」可能是更好的詞 –

相關問題