为什么这个模板类没有编译
Why is this Template Class Not Compiling?
所以我有以下代码:
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&
一起传递。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 使用简单类型列表实现的指数编译时间.为什么
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 为什么 gcc 编译这个而 msvc 没有
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 编译 llvm 3.1 时,为什么会出现错误:在">"标记之前预期主表达式
- 为什么我的 EnumWindowProc 不能用 C 语言编译?
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 为什么下面的模板化类成员函数无法编译?
- 为什么通过指针编译时不能分配 const 初始化
- 如果我的手机是 ARMv8,为什么 Android Studio 会C++编译为 ARMv7?
- 为什么传递非静态成员函数会导致编译错误?
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 为什么使用EnTT进程无法编译
- 为什么许多项目不提供预编译的二进制文件?
- 包含 std::forward 会产生错误,但其省略会编译.为什么
- 我相信 -O2 标志导致我不得不在每台机器上重新编译.为什么
- clang 在 Coliru 中编译此代码段,但不在编译器资源管理器中编译.为什么