C++ C++;另一命名空间中函数的ADL
在声明C++ C++;另一命名空间中函数的ADL,c++,argument-dependent-lookup,C++,Argument Dependent Lookup,在声明getSize之前,我有一个函数模板printSize调用重载函数getSize。为了使我的程序结构更清晰,我想把这两个函数放在不同的名称空间a和B,如注释的代码行所示。但是,ADL将无法找到getSize 实际上,printSize和getSize在不同的头文件中实现。因此,我不能使用namespace指令放置 #包括 #包括 #包括 名称空间A{ 模板结构标记{}; 样板 无效打印尺寸(常数T和数据) { size\u t data\u size=getSize(数据,标记{}); /
getSize
之前,我有一个函数模板printSize
调用重载函数getSize
。为了使我的程序结构更清晰,我想把这两个函数放在不同的名称空间a
和B
,如注释的代码行所示。但是,ADL将无法找到getSize
实际上,printSize
和getSize
在不同的头文件中实现。因此,我不能使用namespace指令放置
#包括
#包括
#包括
名称空间A{
模板结构标记{};
样板
无效打印尺寸(常数T和数据)
{
size\u t data\u size=getSize(数据,标记{});
//size_t data_size=B::getSize(数据,标记{});
std::cout您可以使用using
声明从另一个命名空间引入名称。例如:
template <typename T>
void printSize(const T &data)
{
using B::getSize;
std::size_t data_size = getSize(data, tag<T>{});
std::cout << "Size: " << data_size << std::endl;
}
模板
无效打印尺寸(常数T和数据)
{
使用B::getSize;
std::size\u t data\u size=getSize(数据,标记{});
std::cout您可以使用using
声明从另一个命名空间引入名称。例如:
template <typename T>
void printSize(const T &data)
{
using B::getSize;
std::size_t data_size = getSize(data, tag<T>{});
std::cout << "Size: " << data_size << std::endl;
}
模板
无效打印尺寸(常数T和数据)
{
使用B::getSize;
std::size\u t data\u size=getSize(数据,标记{});
std::cout一种解决方案是将标签放入B
名称空间,并将其拉入A
namespace B {
template <typename T> struct tag {};
}
namespace A {
using B::tag;
}
名称空间B{
模板结构标记{};
}
名称空间A{
使用B::tag;
}
现在,由于tag
来自B
名称空间,它将把B
与ADL关联起来。一个解决方案是将标签放入B
名称空间,并将其拉入A
namespace B {
template <typename T> struct tag {};
}
namespace A {
using B::tag;
}
名称空间B{
模板结构标记{};
}
名称空间A{
使用B::tag;
}
现在,由于tag
来自B
名称空间,它会将B
与ADL关联起来。方法是在它们前面加上名称空间名称??就像你在printSize
中注释掉的语句中所做的那样?当然,在你尝试使用它们之前,要确保函数的声明是可用的。我认为这两个应用程序roaches将不起作用。此库的用户可能会提供额外的getSize
重载,这些重载可能在包含头文件后定义。通过使用名称空间名称作为前缀?就像您在printSize
中注释掉的语句中所做的那样?当然,请确保函数的声明在您试图使用它们。我认为这两种方法都不起作用。此库的用户可能会提供额外的getSize
重载,这些重载可能在包含头文件后定义。这对我不起作用。g++失败时出现错误:“B::getSize”未声明@Dino,B::getSize
应声明在printSize
之前。这对我不起作用。g++失败,出现错误:“B::getSize”未声明
@Dino,B::getSize
应在printSize
之前声明。