问题标签 [function-templates-overloading]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
80 浏览

c++ - C++ 入门第 5 版。函数模板重载

C++ Primer一书中,有一个关于函数模板重载的例子:

如果我们使用指针调用 debug_rep:

这两个函数都会生成可行的实例化:

  • debug_rep(const string* &),这是 debug_rep 的第一个版本的实例化,T绑定到string*

  • debug_rep(string*),这是debug_repT绑定到的第二个版本的实例化string*

的第二个版本的实例化debug_rep与此调用完全匹配。

第一个版本的实例化需要将普通指针转换为指向const. 正态函数匹配表明我们应该更喜欢第二个模板,而且确实是运行的那个。

但是,如果我将指向字符串的指针声明为const虽然没有转换,但总是选择第二个版本:

所以我认为这是本书中的一个错误,我认为因为版本需要一个指针是首选,因为我们传递了一个指针是否const存在(T将被推断为std::string const*or std::string*)。

你怎么看?

0 投票
2 回答
161 浏览

swift - 在Swift中的可选参数上重载泛型函数

我正在尝试编写一个使用模板/泛型类型调度的库,但我无法弄清楚重载解析在 Swift 中是如何工作的。(有没有比The Swift Programming Language更多的技术参考?)

以下工作完全符合我的希望:

这段代码也以同样的方式工作:

但是当我编译这个时:

我收到警告

果然,使用可选参数执行它会破坏堆栈。

我的第一个滑稽的理论是,也许泛型不参与非泛型的重载解决,但这是:

给了我同样的警告,第二次调用破坏了堆栈。

如果v是 type Optional(String),我什至不明白如何v!将其传递给期望 a 的泛型T?

0 投票
0 回答
52 浏览

c++ - C++ Primer 第 5 版:函数模板重载与专业化

我有这个来自 C++ 入门第 5 版的例子:

“我们将特定函数定义为特化函数还是独立的非模板函数都会影响函数匹配。例如,我们定义了两个版本的比较函数模板,一个引用数组参数,另一个引用数组参数const T&。我们还专门针对字符指针进行了专门化这一事实对函数匹配没有影响。当我们在字符串文字上调用 compare 时:

两个函数模板都是可行的,并且为调用提供了同样好的(即精确)匹配。但是,带有字符数组参数的版本更专业(第 16.3 节,第 695 页),并被选择用于此调用。”

  • 我认为这是不正确的:“compare("hi", "mom");两个模板都是可行的”,因为我看到第一个版本T const&, T const&不可行,因为它被实例化为:

在这种情况下大小不同,并且我们知道数组的大小是其类型的一部分,因此这里两个文字字符串具有两种不同的类型,因此模板参数推导将失败,因此该实例化被拒绝。就好像我们写了:compare(5, 0.); // int, double 因此编译器无法推断出此处需要的唯一类型。

  • 为了确认我在说什么,如果我注释掉采用数组类型的版本,那么代码将不会针对具有不同大小的两个文字字符串的调用进行编译。

  • 让我感到困惑的是,如果我注释掉数组类型的版本,即使我有第三个版本(指向字符串的指针),代码也不会编译!这是因为专业化不会影响功能匹配吗?被主模板拒绝的东西被它的所有特化拒绝了?

请说清楚。谢谢!

0 投票
1 回答
68 浏览

c++ - C++ 函数模板重载:空大括号与显式 int

下面有一些非常基本的 C++ 函数模板重载解析示例(从实际代码中最小化)

这里我们有两个案例。在第一种情况下,编译器应默认初始化某些东西(例如 S),在第二种情况下将 int 转换为某些东西(例如 S)

Godbolt 上的实时示例

我相信在这两种情况下,专业化都会赢得重载,因为专业化完全匹配并且实际上比通过部分排序的主模板更专业 [temp.deduct.partial]

但是这个例子中的 clang 11 和 gcc 10.2 都同意在第二种情况下主模板获胜。这是两个编译器中的错误还是(可能)我不了解 C++ 标准?

0 投票
0 回答
55 浏览

c++ - 重载决议如何决定类型和替代类型之间的最佳选择?

我有一个有效的例子,但我相信它不应该

Godbolt 上的实时示例

对于 (1) 一切正常,完全模板匹配优于标准转换 double -> int

但是对于 (2) 产生的实例化看起来对于两个重载都是等效的,我预计在这种情况下会出错

仍然clang 11和gcc 10.2都同意(2)的最佳匹配是foo(int),所以看起来我不明白一些重要的事情

0 投票
0 回答
15 浏览

php - 试图扩展一个类来覆盖一个函数 PHP

好的,我有一个我正在尝试扩展的插件的父类:

我要扩展的代码如下:由于某种原因它不起作用....

有任何想法吗?我对此完全不知所措......哦,在我忘记之前。有一个父类在另一个文件中实例化,该文件使用 include_once 调用包含我的代码的文件

0 投票
1 回答
48 浏览

c++ - 为什么编译器(g++)找不到第一个添加函数?

在这里,void add(Key& key,Value& value) { add(root,new SBTNode<Key,Value>(key,value));} };我想调用第一个add函数,但是,编译器似乎认为唯一的候选函数是void add(Key& key,Value& value).

我试图替换为add<Key,Value>(root,new SBTNode<Key,Value>(key,value));,编译器只是告诉我 <,> 是错误的。

当我给这两个函数起不同的名字时,一切都是对的,在这种情况下函数重载有什么问题?

0 投票
3 回答
206 浏览

c++ - 使用模板化类型重载函数模板

我有一个这样的给定函数:

这个函数有各种重载,其中一些是基于概念的。类似于以下内容:

现在我想使用模板类型添加一个重载,类似于以下内容:

为此,我需要指定V类型。但是我找不到允许V在不破坏代码的情况下进行指定的语法。

函数调用如下:

这意味着,模板类型是明确提供的,重载可能不会改变模板参数的数量或顺序,否则编译器会报错。

如何解决?

0 投票
1 回答
195 浏览

c++ - 是什么导致这两个函数模板之间的重载失败?

下面是一个非常简短的例子。

错误很清楚

但我不明白为什么int在第二个重载中作为固定模板参数并不能使它更专业。毕竟,如果我, std::enable_if_t<std::is_same_v<int,U>>从中删除,那么它首选。

0 投票
1 回答
99 浏览

c++ - 在 C++ 中重载乘法运算符的正确方法(双向)

我设法了解如何将重载运算符实现为成员函数。这种方式认为对象(实例)始终传递给操作员。为了让它工作,我在类外定义了我的重载运算符。仅当我在头文件(.hpp)中定义它时才有效。如果我将函数添加到 .cpp 文件,为什么编译器会忽略它?一段代码如下:

下面显示的最后一个函数仅在我将其添加到头文件时才有效。

主文件是

编译错误是

'operator*' 不匹配(操作数类型为 'double' 和 'point') X=m*X;

如果我在头文件中重载乘法运算符,则重载可以从双点或双点两个方向正常工作。