Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;另一命名空间中函数的ADL_C++_Argument Dependent Lookup - Fatal编程技术网

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
之前声明。