我在相應的命名空間中定義了以下運算子:
namespace literals
{
constexpr ID operator"" _ID(const unsigned long long dyngateID)
{
// ...
// return a constructed id
}
namespace multiplied
{
constexpr ID operator"" _ID(const unsigned long long dyngateID)
{
// ...
// return an id constructed in a specific way
}
} // namespace multiplied
} // namespace literals
在 .cpp 檔案中,我想同時使用這兩個函式,因此我已經宣告了using namespace literals,當我using namespace multiplied在一個具體函式中宣告時,我得到了ambiguous call to overloaded function編譯錯誤。如何區分這些功能?
Test.cpp
using namespace literals;
void f()
{
// here I am using literals' _ID which is fine
const Type id{1_ID};
}
void g()
{
// here I want to use multiplied's _ID, but obviously I am failing to do so
using namespace multiplied;
const Type id{1_ID};
}
uj5u.com熱心網友回復:
名稱查找規則using namespace使得由它引入的宣告似乎位于包含當前名稱空間范圍和目標名稱空間范圍的最內層名稱空間范圍內。
因此,基于多個可達using namespace陳述句的范圍來消除歧義是沒有好處的。
相反,您可以使用宣告匯入using宣告:
void g()
{
using multiplied::operator""_ID;
const Type id{1_ID};
}
這將表現得好像運算子是在作用域中宣告的,因此名稱查找將在那里停止并且不會查看由 external 匯入的宣告using namespace。
或者,您可以使用合格的呼叫直接呼叫用戶定義的文字運算子:
void g()
{
const Type id{multiplied::operator""_ID(1)};
}
作為另一種可能性,您始終可以限制using namespace陳述句的范圍,以便使用運算子從任何給定范圍內只能訪問一個using namespace literals;or ,例如:using namespace literals::multiplied;
// no using namespace at this scope
void f()
{
using namespace literals;
const Type id{1_ID};
}
void g()
{
using namespace literals::multiplied;
const Type id{1_ID};
}
uj5u.com熱心網友回復:
考慮以下代碼:
#include <iostream>
namespace one
{
int func(int num1, int num2)
{
return num1 * num2;
}
namespace two
{
int func(int num1, int num2)
{
return num1 * num2;
}
}
}
int f()
{
return one::two(1, 2) 10;
}
int g()
{
return one::two::func(3, 4) 10;
}
int main()
{
std::cout << f() << std::endl;
std::cout << g() << std::endl;
}
上面的代碼將完美地編譯和運行,并且可以按預期作業,使用f()usingone::func()和g()using one::two::func()。如果你必須寫“使用命名空間一;” 然后你可以做這樣的事情:
using namespace one;
int f()
{
return func(1, 2) 10;
}
int g()
{
return two::func(3, 4) 10;
}
這也將導致相同的輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435292.html
