c++ - 为什么这个模板类没有编译?

标签 c++ templates constructor variadic-templates

所以我有以下代码:

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. 我明白这一点,但我认为类型推断可以克服这个问题以允许更清晰的语法。

最佳答案

因为模板参数推导只适用于函数。类模板始终明确要求参数。

这就是为什么许多模板都有一个“命名构造函数”——一个简单地构造一个临时实例的函数,但由于是一个函数模板而不是类模板来推导参数。例如std::make_pair .

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) 更容易,因为这将涉及根据构造函数之间的重载决议推导类型和根据推导类型的可行构造函数集之间的循环依赖性(请记住,构造函数可以重载,类型可以部分特化)。

关于c++ - 为什么这个模板类没有编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22721474/

相关文章:

iphone - 更改 Xcode 文件模板中的大小写?

c++ - 使用派生类构造函数初始化对象

c++ - 为什么我的法线不能在顶点之间进行插值,从而产生平面着色效果?

html - 如何将 font-awesome 与 mjml 一起使用?

android - 如何在 Android Studio 中创建自定义项目模板

inheritance - 派生类的大括号(无构造函数)初始化

c# - 从 List<Class> 高效地创建 List<Class>?

c++ - 如何使用nlohmann检查c++中嵌套json中是否存在 key

c++ - arm gcc5 的交叉编译 - 正确使用 memcpy

python - 将 C 缓冲区的内容复制到 numpy 数组