2

C++ 和 Java 在处理参数多态性方面有这种相似之处:两者都将类型参数推断为常规函数或方法,但要求程序员在调用构造函数时显式给出类型参数(尽管这在 Java 7 中已更改)。

这种行为背后的技术原因是什么?

编辑:我错误地认为这也适用于 Scala。下面是一个来自 Java 的示例:

class Foo<T> {
    Foo(T x) { }
}

<T> void foo(T x) { }


Foo<Integer> f = new Foo(3);
foo(3);

这两个都是合法的,但第一个创建一个“原始类型”而不是 a Foo<Integer>,并执行未经检查的赋值。

4

1 回答 1

3

这是因为 C++ 模板可以被专门化。

这意味着仅仅因为有一个主要定义:

template<typename T>
class Foo
{
    Foo(T x) { }
};

显然int会被 接受Foo<int>(int),完全有可能还有一个专门的定义

template<>
class Foo<Foobar>
{
    Foo(int x) { }
};

它也接受一个int参数。

将用户定义的类型转换添加到混合中,您会发现无法从函数参数中找出类的类型参数。

事实上,构造函数的类型参数的推断是允许的。但不是类模板参数的推断。例如,在构造智能指针时允许隐式向上转换:

template<typename T>
class a_smart_ptr
{
    template<typename TOther>
    a_smart_ptr(TOther* p) { }
};
于 2013-12-20T05:19:19.527 回答