【发布时间】:2013-04-07 02:16:56
【问题描述】:
我创建了一个模板类,并将 T 作为默认类型参数传递。但是,这会导致编译失败。任何人都可以解释会发生什么?谢谢!
PS。我使用的编译器是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;
}
编译器输出:
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
【问题讨论】:
-
看起来像一个 MSVC 编译器错误。在 g++ 4.7.0 下编译良好。
-
@Yuushi 真的吗?非常感谢。我只是想制作一个相当于 function
. 的默认版本的 function -
编译器将您的
T转换为void(*)()而不是void(),然后将其传递给std::function,这不是传递给std::function的有效类型。如果你真的想解决这个问题,你可以编写一个解决方法,将A(B...)或A(*)(B...)作为一个参数,将template<typename>class F作为另一个参数,并使用F<A(B...)>。 -
这绝对是一个编译器错误。我已在我们的内部数据库中将其归档为 DevDiv#671343。
-
@Patz 恭喜 - MS 本身的录取!
标签: c++ templates visual-c++ visual-studio-2012 c++11