当我尝试将函数作为模板模板类型参数传递给类时,遇到错误。为什么语言核心开发人员将无法启用此功能?可以传递函子类模板,但不能传递函数模板。
例如,在“ g ++(Ubuntu 8.3.0-6ubuntu1)8.3.0”中编译以下代码:
#include <iostream>
using namespace std;
template <template <typename> typename Functor>
class UseFunc
{
public:
void use()
{
Functor<int>(3);
Functor<char>('s');
}
};
template <typename T>
void func(T s)
{
cout << s << endl;
}
int main()
{
UseFunc<func> u {};
u.use();
}
告诉:
kek.cpp: In function ‘int main()’:
kek.cpp:24:14: error: type/value mismatch at argument 1 in template parameter list for ‘template<template<class> class Functor> class UseFunc’
UseFunc<func> u {};
^
kek.cpp:24:14: note: expected a class template, got ‘func’
kek.cpp:25:4: error: request for member ‘use’ in ‘u’, which is of non-class type ‘int’
u.use();
^~~
我希望它的实现方式与传递模板模板参数相同。归根结底,这只是对编译器的请求,因此可以实例化并以通常的方式使用具体类型的函数。
完全不了解此限制,如果有人可以告诉我实现此限制的难度,那将是很好的。
答案 0 :(得分:2)
我不确定为什么C ++不提供函数模板参数的问题,但我想它与以下问题有关:
如果您相信自己知道如何解决所有这些问题,并且尤其可以提供一个令人信服的论点,说明尽管语言复杂,我们仍需要使用此功能,我们可以使用类来解决它的缺失模板参数,请随时为标准编写建议。