- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习如何使用 std::chrono 并且我想让模板类 Timer 易于使用(在 timer.h
中定义)。测试程序很成功,一切正常,直到我尝试在一个定义了一些模板运算符的程序中使用我的新 Timer,这与 Timer 中使用的运算符相冲突。
内部计时器我必须使用 operator-
在 start_time
类型的两个变量( end_time
和 std::chrono::time_point
)之间,以获得duration
包含耗时的变量。
在另一个头文件( algebra.h
)中,我实现了二进制文件 operator-
的重载。区分两个 std::vector
或两个 std::array
,或者也可以是随 operator[]
提供的用户定义容器和 size()
成员函数。
template<typename pointType>
pointType operator-(pointType a, const pointType & b){
for(int i = 0; i < a.size(); ++i){
a[i] = a[i] - b[i];
}
return a;
}
timer.h
和
algebra.h
,编译器会抛出一个错误,提示“操作符重载的模棱两可”,暗示
algebra.h
中的两个操作符作为可能的候选者。以及在
<chrono>
中实现的那个.
pointType
不能推导出为
std::chrono::time_point
因为它没有
operator[]
和
size()
成员函数。
std::valarray
的程序时感到更加困惑。 .当我同时包含
<valarray>
时和
"algebra.h"
,并尝试在两个 valarrays 之间做出区别,我希望编译器会提示
operator-
的模糊定义, 自
std::valarray
已经实现了二元运算符。但这不会发生:它使用
<valarray>
进行编译。执行。为什么这不会引发错误?
最佳答案
这是模棱两可的,因为编译器只查看函数签名来测试模棱两可,而不是函数体。在您的示例中,这是函数签名:
template<typename pointType>
pointType operator-(pointType a, const pointType & b)
pointType
可以推导出为
std::chrono::time_point
.但是,
chrono
中已经声明了一个二元减号运算符。
std::chrono::time_point
的标题(
https://en.cppreference.com/w/cpp/chrono/time_point/operator_arith2)。这就是导致歧义错误的原因。
std::chrono::time_point
独有的。 , 但也将出现在包含具有成员或非成员二进制减号运算符的类的任何其他 header 中,其中两个参数属于相同类型(或可以隐式转换为相同类型)。也许有问题类型的一组简单的函数重载:
template<typename T>
std::vector<T> operator-(const std::vector<T>& a, const std::vector<T>& b);
template<typename T, size_t N>
std::array<T,N> operator-(const std::array<T,N>& a, const std::array<T,N>& b);
template<typename T>
T pointwise_subtract(const T& a, const T& b);
//enable this template if the type T has a member method "size" and
// subscript operator accepting variables of type "size_t"
template<typename T, typename=std::void_t<
decltype(std::declval<T>().size()),
decltype(std::declval<T>()[std::declval<size_t>()])
>
T operator-(const T& a, const T& b);
关于c++ - 编译器抛出 "ambiguous overload for operator",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61533940/
“过载”/“过载”在编程方面是什么意思? 最佳答案 这意味着您提供了一个具有相同名称但具有不同签名的函数(方法或运算符)。 例如: void doSomething(); int doSomethin
Kotlin 是允许我们轻松定义各种预定义运算符行为的语言之一,该操作名为运算符重载 - https://kotlinlang.org/docs/reference/operator-overload
所以我正在尝试实现 xorshift PRNG 作为来自 random 的参数化 STL 样式类,例如std::mersenne_twister_engine , 所以我可以将它与来自 random
请给我一个具体的答案,为什么函数覆盖会隐藏基类中重载的函数。 class Base{ public: fun(int,int); fun(B); }; class Derived:public
假设我在 Alloy 4.2 中有以下签名声明: sig Target {} abstract sig A { parent: lone A, r: some Target } sig
我正在对API进行建模,其中方法重载将是一个很好的选择。我的幼稚尝试失败了: // fn attempt_1(_x: i32) {} // fn attempt_1(_x: f32) {} // Er
在方法重载中,重载方法是否可以有不同的返回类型? 例如, void foo(int x) ; int foo(int x,int y); double foo(String str); 在一般的面向对
这个问题已经有答案了: Why is implicit conversion from int to Long not possible? (3 个回答) 已关闭 5 年前。 使用包装类重载方法 vo
我正在为一个 API 建模,其中方法重载非常适合。我天真的尝试失败了: // fn attempt_1(_x: i32) {} // fn attempt_1(_x: f32) {} // Error
我正在为一个 API 建模,其中方法重载非常适合。我天真的尝试失败了: // fn attempt_1(_x: i32) {} // fn attempt_1(_x: f32) {} // Error
1、方法的重载 方法名一样,但参数不一样,这就是重载(overload)。 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样。只要这两方面有其中的一
我正在设计我自己的编程语言(称为 Lima,如果你在 www.btetrud.com 上关心它),我正在努力思考如何实现运算符重载。我决定在特定对象上绑定(bind)运算符(它是一种基于原型(prot
我正在尝试将运算符用于 Wicket,这非常冗长。 我最想要的功能是使用一元“+”到add()一个组件。 但它需要在每个 MarkupContainer 的上下文中工作。后人。 使用应该是这样的: c
运算符重载如何与函数重载相关联。我的意思是我不太明白如何使用自身已重载的函数来重载运算符。 最佳答案 Operator 只是给中缀函数(写在参数之间的函数)的时髦名称。所以,1 + 2 只是一个 +(
是否有可能过载 __cinit__或 __add__ ? 像这样的东西: cdef class Vector(Base): cdef double x, y, z def __cini
我开始使用 smalltalk,我正在尝试添加一个新的赋值运算符 :> . pharo 中使用的当前运算符不是选择器,所以我开始查看下划线 _ 的类 Scanner可以为分配启用。我试图以类似的方式做
假设我有以下类(class): class A { has $.val; method Str { $!val ~ 'µ' } } # Is this the right way
我试图像这样重载>>运算符: class A {} multi sub infix:«>>»(A:D $a, Str() $b) is assoc { dd $a; dd $b } my $x = A
在 C++ 中,您可以创建使用特定运算符的模板类 模板化对象和实例化这些对象的类 必须重载该特定运算符才能使其对象与 模板类。例如,insertion BST实现的方法 可能依赖 Nil ) {
有时,我在未重载的方法后面有“overload”关键字。 除了代码的可读性和可维护性之外,这还有我应该注意的其他影响吗? 最佳答案 最大的区别在于,当方法的参数不正确时,错误消息对于非重载方法来说明显
我是一名优秀的程序员,十分优秀!