为什么这个模板类没有编译

Why is this Template Class Not Compiling?

本文关键字:编译 为什么      更新时间:2023-10-16

所以我有以下代码:

template <typename Type>
class Delegate
{
public:
    Delegate(Type x)
    {
    }
};
void Method()
{
}
int main()
{
    Delegate d(&Method);
    return 0;
}

我的问题是:为什么编译器不能根据传递到构造函数的内容来推导模板类型?我得到的编译错误是:Argument list for class template Delegate is missing.我理解这一点,但我认为类型推理可以克服这一点以实现更干净的语法。

因为模板参数推导只适用于函数。类模板总是明确地需要参数。

这就是为什么许多模板都有一个"命名构造函数"——一个简单地构造临时实例的函数,但由于是函数模板而不是类模板,因此可以推导参数。例如CCD_ 2。

C++11引入了auto的这个新含义,它实际上允许您推导变量的类型。因此,如果你有C++11,你可以为你的类创建一个"命名构造函数",比如:

template <typename Type>
Delegate<Type> delegate(Type x) { return Delegate<Type>(x); }

你可以用它创建一个推导类型的变量,比如:

auto d = delegate(&Method);

注意,这会将d推导为初始化器返回的类型(如果需要,可以使用auto &auto &&,但除此之外没有太多(。这比试图推导假设的Delegate d(&Method)要容易得多,因为这将涉及根据构造函数之间的重载解析推导类型和根据推导类型的可行构造函数集之间的循环依赖性(记住,构造函数可以重载,类型可以部分专用(。

这与不起作用的原因相同

// attempt to create a std::vector<std::string> of ten "x" strings:
std::vector v(10, "x");

事实上,它应该会导致相同的错误消息。

使用类似的东西来使用类型推导:

template <class Type>
Delegate<Type> MakeDelegate(Type const &x)
{
    return Delegate<Type>(x);
}

或者像使用std::vector一样,显式地声明类型。

顺便说一下,main必须返回int,并且未知类型(即模板中(的参数应与const&一起传递。

相关文章: