C++ 为什么将T作为默认参数从外部模板传递给std::函数会导致编译错误?

C++ 为什么将T作为默认参数从外部模板传递给std::函数会导致编译错误?,c++,templates,visual-c++,visual-studio-2012,c++11,C++,Templates,Visual C++,Visual Studio 2012,C++11,我创建了一个模板类,并将T作为默认类型参数传递。但是,这会导致编译失败。谁能解释发生了什么?谢谢大家! 我使用的编译器是VS2012 #include <functional> using namespace std; template <typename T = void()> struct delegate { typedef function<T> function_t; function_t f; }; int main() {

我创建了一个模板类,并将T作为默认类型参数传递。但是,这会导致编译失败。谁能解释发生了什么?谢谢大家!

我使用的编译器是VS2012

#include <functional>

using namespace std;

template <typename T = void()>
struct delegate
{
    typedef function<T> function_t;

    function_t f;
};

int main()
{
    delegate<> d;

    return 0;
}
#包括
使用名称空间std;
模板
结构委托
{
类型定义功能;
函数f;
};
int main()
{
d代表;
返回0;
}
编译器输出:

1>.\Microsoft Visual Studio 11.0\VC\include\functional(554): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=void (__cdecl *)(void)
1>          ]
1>          test.cpp(12) : see reference to class template instantiation 'std::function<_Fty>' being compiled
1>          with
1>          [
1>              _Fty=void (__cdecl *)(void)
1>          ]
1>          test.cpp(17) : see reference to class template instantiation 'delegate<>' being compiled
1>.\Microsoft Visual Studio 11.0\VC\include\functional(555): error C2504: 'type' : base class undefined
1>.\Microsoft Visual Studio 11.0\VC\include\functional(558): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=void (__cdecl *)(void)
1>          ]
1>.\Microsoft Visual Studio 11.0\VC\include\functional(558): error C2146: syntax error : missing ';' before identifier '_Mybase'
1>.\Microsoft Visual Studio 11.0\VC\include\functional(558): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>\Microsoft Visual Studio 11.0\VC\include\functional(554):错误C2027:使用未定义的类型“std::\u Get\u function\u impl”
1> 与
1>          [
1> _Tx=无效(u cdecl*)(无效)
1>          ]
1> cpp(12):请参阅对正在编译的类模板实例化“std::function”的引用
1> 与
1>          [
1> \u Fty=无效(\u cdecl*)(无效)
1>          ]
1> cpp(17):请参阅对正在编译的类模板实例化'delegate'的引用
1> .\Microsoft Visual Studio 11.0\VC\include\functional(555):错误C2504:“类型”:基类未定义
1> .\Microsoft Visual Studio 11.0\VC\include\functional(558):错误C2027:使用未定义的类型“std::\u Get\u function\u impl”
1> 与
1>          [
1> _Tx=无效(u cdecl*)(无效)
1>          ]
1> .\Microsoft Visual Studio 11.0\VC\include\functional(558):错误C2146:语法错误:缺少“;”在标识符“\u Mybase”之前
1> .\Microsoft Visual Studio 11.0\VC\include\functional(558):错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认int

如您的问题的注释所示:这只是VisualStudio中的一个bug,而不是C++代码的任何错误。Stephan-T-Lavavej说他以DevDiv#671343的名义提交了这份文件

假设@Yakk的诊断是正确的(MSVC错误地将
T
视为
void(*)(
),而不是
void()
),我以前提出了

typedef函数;

但正如@JoshPeterson在下面评论的那样,即使进行了更改,该错误仍然会出现在VS2013中,因此它实际上不是一个解决方法。

看起来像MSVC编译器的错误。在g++4.7.0下编译得很好。@Yuushi哦,真的吗?非常感谢你。我只是想创建一个默认版本的函数,它与函数等效。编译器正在将
T
转换为
void(*)()
,而不是
void()
,然后将其传递给
std::function
,这不是传递给
std::function
的有效类型。如果您真的想解决这个问题,您可能可以编写一个变通方法,将
a(B…
a(*)(B…)
作为一个参数,将
模板类F
作为另一个参数,并执行
F
。这肯定是一个编译器错误。“我已经在我们的内部数据库中以DevDiv#671343的名义提交了这个文件。@Patz恭喜你——微软自己也承认了这一点!使用Visual Studio 2013,我替换了
typedef函数带有
typedef功能问题仍然存在。我刚刚在Visual Studio 2013 Update 1中尝试了原始问题和建议的解决方法。不过,两者都不会编译。
typedef function<typename remove_pointer<T>::type> function_t;