- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
感谢 Standard 的引述。
#include <iostream>
namespace X {
class A {};
}
template <typename T>
inline T const& max(T const& a, T const& b, T const& c)
{
return max(max(a, b), c);
}
inline X::A const& max(X::A const& a, X::A const& b)
{
std::cout << "non-template" << '\n';
return a;
}
int main()
{
X::A a, b, c;
max(a, b, c);
}
namespace X {
template <typename T>
inline T const& max(T const& a, T const& b)
{
std::cout << "template" << '\n';
return a;
}
}
最佳答案
调用max()
在示例中需要一个从属名称,因为它的参数取决于模板参数 T
.此类从属名称的两阶段名称查找在标准中定义如下:
14.6.4.2 候选函数 [temp.dep.candidate]
1 For a function call where the postfix-expression is a dependent name, the candidate functions are found using the usual lookup rules (3.4.1, 3.4.2) except that:
— For the part of the lookup using unqualified name lookup (3.4.1), only function declarations from the template definition context are found.
— For the part of the lookup using associated namespaces (3.4.2), only function declarations found in either the template definition context or the template instantiation context are found.
非限定查找定义为
3.4.1 非限定名称查找 [basic.lookup.unqual]
1 In all the cases listed in 3.4.1, the scopes are searched for a declaration in the order listed in each of the respective categories; name lookup ends as soon as a declaration is found for the name. If no declaration is found, the program is ill-formed.
和参数依赖查找(ADL)作为
3.4.2 参数相关名称查找[basic.lookup.argdep]
1 When the postfix-expression in a function call (5.2.2) is an unqualified-id, other namespaces not considered during the usual unqualified lookup (3.4.1) may be searched, and in those namespaces, namespace-scope friend function or function template declarations (11.3) not otherwise visible may be found. These modifications to the search depend on the types of the arguments (and for template template arguments, the namespace of the template argument).
在您的示例中,非限定查找和 ADL 都没有发现任何重载在定义点,因为编译器没有看到任何双参数 max()
然而。 ADL 也适用于在实例化时,那时,编译器已经看到了两个参数 template max(T, T)
这是唯一可以调用的。 (区别在于模板实例化发生在整个翻译单元被解析之后)。
您应该通过放置非模板 max(X::A, X::A)
来修复您的代码namespace X
内部过载并移动 template max(T, T)
#include <iostream>
// generic code
template <typename T>
inline T const& max(T const& a, T const& b)
{
std::cout << "template" << '\n';
return a;
}
template <typename T>
inline T const& max(T const& a, T const& b, T const& c)
{
using ::max; // fallback if no user-defined max
return max(max(a, b), c);
}
// X specific code
namespace X {
class A {};
inline X::A const& max(X::A const& a, X::A const& b)
{
std::cout << "non-template" << '\n';
return a;
}
} // namespace X
int main()
{
X::A a, b, c;
max(a, b, c);
}
Live-Example打印“非模板”两次。
关于c++ - 编译器如何在下面的代码中通过ADL找到模板函数X::max(T const&, T const&)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24533091/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关于您编写的代码问题的问题必须在问题本身中描述具体问题 — 并且包括有效代码 以重现它。参见 SS
我有一个布局,它有一个 EditText,当用户输入时应该在它下面显示建议。我以编程方式创建了一个 RecyclerView,它应该在 EditText 下面显示建议项目。但是当用户输入时它不显示 R
我正在尝试将 下面各三 s(一个 每三个 s),但是我得到了意想不到的结果。我得出的结论是我必须放一个 低于三分之一 ,但是当我这样做时,它的位置不正确(请参阅演示)。 我正在使用这个 Djan
我知道这个问题已经被问过好几次了,我已经尝试了其他答案中建议的所有方法,但似乎没有任何方法可以使我的 div 位于需要的位置。奇怪的是,一夜之间我的一个 div 想要低于前一个 div。开始时是 fl
好的,我明白了,当离开 .wrapper 时,带有 overflow:hidden 的元素 .wrapper 的所有子元素都会被自然切割的边界框。但这里我只应用了overflow:auto。 是关于下
我有一个元素 The result is ... Test_then 类如下所示: .Test_then::before { content: 'Then'; } 我的目标是让 (The resu
我有一个下拉菜单,它适用于除 IE6 和 IE7 之外的所有内容。 Here it is in the Safari/Firefox browsers Here is how it looks in
我尝试从支持库 13 实现最新的抽屉布局。使用以下代码,抽屉始终显示在 gridview 下方。即使我尝试调用 bringToFront() 仍然无法正常工作。能帮忙看看是什么问题吗?谢谢。 acti
这个问题在这里已经有了答案: using a div to blur an image behind it? [duplicate] (2 个答案) 关闭 7 年前。 我目前正在 Photoshop
我正在阅读一本有关 Java 的书,并发现了以下源代码。 //This example demonstrates how to search multiple occurences of a sear
我想让一个新的/隐藏的 div 从另一个 div 下面滑下来。我的想法是我有一个输入字段和一个添加按钮。单击添加按钮时,会显示更多表单元素(从下方滑出)。这个的形式部分对我的问题并不重要,所以我只让第
我正在制作一种标签栏,其下方有一个指示器,指示选择了哪个标签。我的 View 层次结构非常简单: --------------------------------- |-------------
我什至不知道如何描述这一点,我还在学习,而且还是个新手。 我有一个用于容器的 div。 里面有一个用于菜单的 div 和一个用于内容的 div,两者并排向左浮动。 对于大多数普通内容,它们并排放置。然
我想要一个与浏览器窗口高度相同的 div,以及位于该 div 下方的另一个 div。 我所有的尝试都未能堆叠 div,而是将它们重叠。 我的元素正在尝试的一种天真的实现。 这是我的 fiddle
我正在尝试根据 this codepen 设置联系表单的样式并且 float 表单在其父 div 下面而不是在其中时遇到问题。我试过添加一个 clearfix,但没有成功。我也没有运气就把溢出弄得一团
我是网络开发新手,需要一些帮助来解决这个简单的问题。调整大小时,菜单项会移动到名称下方,有人能告诉我哪里搞砸了吗? 我一直在阅读其他一些解决方案并了解想法,但就是找不到我的错误。 > A
我正在尝试为移动设备开发一个 HTML5 应用程序。布局是非常基本的标题和内容。 标题(红色矩形)、内容(绿色矩形)是绝对 div。如果高度大于屏幕,则内容必须是可滚动的。 当我试图只在橙色矩形 di
我正在尝试将这个 ul 移动到 div 下面,我什至不确定这是否也是完美的方法, 这是代码, HTML User 1
我的处境很复杂。首先,我有两列,当屏幕变小时,它们会在彼此下面。我的问题是在其中一列中我有一个相对的 div。我想要另一个 div 直接在它下面,但它一直与第一个 div 重叠。 这是我的代码:
例如,如果我使用了对齐,如何将一张 table 放在另一张 table 下面。 center_table left_table desired_table
我是一名优秀的程序员,十分优秀!