我目前正试图把我的头脑围绕着打字机和实例,但我还不太明白它们的意义。到目前为止,我对这个问题有两个问题:
1)当函数使用某个类型类的某个函数时,为什么函数签名中需要有一个类型类。示例:
f :: (Eq a) => a -> a -> Bool
f a b = a == b
为什么要把(Eq a)放在签名里。如果==不是为a定义的,那么为什么不直接在遇到a == b时抛出错误呢?在前面声明类型类有什么意义?
2)类型类与函数重载有何关系?
这样做是不可能的:
data A = A
data B = B
f :: A -> A
f a = a
f :: B ->
C++只允许重载=运算符作为成员函数,而不是全局函数。
Bruce Eckel说if it was possible to define operator= globally, then you might attempt to redefine the built-in = sign.,由于这个原因,你只能重载=运算符作为成员函数。
如果C++已经定义了=运算符,那么为什么还要定义+、-等其他运算符呢?不是由C++定义的,因为它们可以作为非成员函数重载。?
我知道在C中重载是不可能的,我想知道:为什么类内和类外的重载函数在C++中处理相同?
考虑一下在C++中,函数在类之外声明的情况:
foo()
foo(char c)
foo(int a, int b)
如果C++将每个函数头视为唯一,为什么C也不能这样做呢?
我认为这可能是原因:
函数重载是在C++中引入的,所以在C中是不可用的。
多态性是一个面向对象的概念,但C不是面向对象的.
C中没有功能超载的原因吗?
下面是"the c++ programming language“中的几行代码
template<class T > T sqrt(T );
template<class T > complex<T> sqrt(complex<T>);
double sqrt(double);
void f(complex<double> z )
{
s q r t (2 ); // sqrt<int>(int)
sqrt(2.0) ; // sqrt(double)
sqrt(z) ; // sqrt<double>
我想知道是否不鼓励重载STL函数,如果是,为什么?
昨天我遇到了一个问题,我发现std::fpclassify在微软编译器()上并没有像其他编译器那样存在一个完整的重载(参见中的(4) )。
当我试图编译时,我遇到了这个问题。
T var; // T can be an integral type
std::isnan(var); //
使用microsoft C++编译器。
我已经有了一个解决这个问题的可行解决方案,这个解决方案不涉及重载std::fpclassify,但我确实考虑过可能只是自己为std::fpclassify编写一个重载,但看起来会变得很复杂,因为代码可能是使用非micr