C++ 如何初始化此结构?

C++ 如何初始化此结构?,c++,templates,gcc,c++11,clang,C++,Templates,Gcc,C++11,Clang,我在clang中遇到了编译器错误,所以我开始减少一个最小的测试用例。但对于大多数简化测试用例,GCC告诉我们它包含一个语法错误。如何初始化此结构 template<typename F> struct Item { F *foo(); // with std::function clang also crash }; template<typename F> struct Container { static const Item<F> items[

我在clang中遇到了编译器错误,所以我开始减少一个最小的测试用例。但对于大多数简化测试用例,GCC告诉我们它包含一个语法错误。如何初始化此结构

template<typename F>
struct Item
{
  F *foo(); // with std::function clang also crash
};

template<typename F>
struct Container
{
  static const Item<F> items[];
};


template<typename F>
const Item<F> Container<F>::items[] =
{
  {  []() -> F { } }
  // {{  []() -> F { } }} this also wrong
};

template struct Container<int>;

int main()
{
  return 0;
}
模板
结构项
{
F*foo();//with std::function clang也会崩溃
};
模板
结构容器
{
静态常量项项[];
};
模板
常量项容器::项[]=
{
{[]()->F{}
//{{[]()->F{}}这也是错误的
};
模板结构容器;
int main()
{
返回0;
}
海湾合作委员会说:

clangBug.cc: In instantiation of ‘const Item<int> Container<int>::items []’:
clangBug.cc:24:17:   required from here
clangBug.cc:17:15: error: too many initializers for ‘const Item<int>’
clangBug.cc:在“const Item Container::items[]”的实例化中:
clangBug.cc:24:17:此处为必填项
clangBug.cc:17:15:错误:“const Item”的初始值设定项太多
叮当声主机头(040cd82aadd48ba50e9742881d648d53ddd2a6c9)与以下部件碰撞:

3  libc.so.6       0x00007f304c590037 gsignal + 55
4  libc.so.6       0x00007f304c593698 abort + 328
5  libc.so.6       0x00007f304c588e03
6  libc.so.6       0x00007f304c588eb2
7  clang           0x0000000000cd823e clang::Sema::InstantiateClassMembers(clang::SourceLocation, clang::CXXRecordDecl*, clang::MultiLevelTemplateArgumentList const&, clang::TemplateSpecializationKind) + 1646
8  clang           0x0000000000cd82f4 clang::Sema::InstantiateClassTemplateSpecializationMembers(clang::SourceLocation, clang::ClassTemplateSpecializationDecl*, clang::TemplateSpecializationKind) + 68
9  clang           0x0000000000c6c341 clang::Sema::ActOnExplicitInstantiation(clang::Scope*, clang::SourceLocation, clang::SourceLocation, unsigned int, clang::SourceLocation, clang::CXXScopeSpec const&, clang::OpaquePtr<clang::TemplateName>, clang::SourceLocation, clang::SourceLocation, llvm::MutableArrayRef<clang::ParsedTemplateArgument>, clang::SourceLocation, clang::AttributeList*) + 2225
10 clang           0x000000000097cb65 clang::Parser::ParseClassSpecifier(clang::tok::TokenKind, clang::SourceLocation, clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, bool, clang::Parser::DeclSpecContext, clang::Parser::ParsedAttributesWithRange&) + 5733
11 clang           0x0000000000962dd7 clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, clang::Parser::DeclSpecContext, clang::Parser::LateParsedAttrList*) + 3511
12 clang           0x00000000009c4a98 clang::Parser::ParseSingleDeclarationAfterTemplate(unsigned int, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject&, clang::SourceLocation&, clang::AccessSpecifier, clang::AttributeList*) + 632
13 clang           0x00000000009c3fda clang::Parser::ParseExplicitInstantiation(unsigned int, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation&, clang::AccessSpecifier) + 154
3 libc.so.6 0x00007f304c590037 gsignal+55
4 libc.so.6 0x00007f304c593698中止+328
5 libc.so.6 0x00007f304c588e03
6 libc.so.6 0x00007f304c588eb2
7 clang 0x0000000000cd823e clang::Sema::InstanceClassMembers(clang::SourceLocation,clang::CXXRecordDecl*,clang::MultiLevelTemplateArgumentList const&,clang::TemplateSpecializationKind)+1646
8 clang 0x0000000000cd82f4 clang::Sema::InstanceClassTemplateSpecializationMembers(clang::SourceLocation,clang::ClassTemplateSpecializationDecl*,clang::TemplateSpecializationKind)+68
9 clang 0x0000000000c6c341 clang::Sema::Actonexplicitinstation(clang::Scope*,clang::SourceLocation,clang::SourceLocation,unsigned int,clang::SourceLocation,clang::CXXScopeSpec const&,clang::OpaquePtr,clang::SourceLocation,clang::SourceLocation,llvm::MutableArrayRef,clang::SourceLocation,clang::AttributeList*)+2225
10 clang 0x000000000097cb65 clang::Parser::Parser::DeclSpecContext,clang::SourceLocation,clang::DeclSpec&,clang::Parser::ParsedTemplateInfo const&,clang::AccessSpecifier,bool,clang::Parser::DeclSpecContext,clang::Parser::ParsedAttributesWithRange&+5733
11 clang 0x0000000000962dd7 clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&,clang::Parser::ParsedTemplateInfo const&,clang::AccessSpecifier,clang::Parser::DeclSpecContext,clang::Parser::LateParsedAttrList*)+3511
12 clang 0x00000000009c4a98 clang::Parser::ParseSingleDeclarationAfterTemplate(unsigned int,clang::Parser::ParsedTemplateInfo const&,clang::ParsingDeclraiObject&,clang::SourceLocation&,clang::AccessSpecifier,clang::AttributeList*)+632
13 clang 0x00000000009c3fda clang::Parser::parseexplicitintiation(unsigned int,clang::SourceLocation,clang::SourceLocation,clang::SourceLocation&,clang::AccessSpecifier)+154

如果我正确理解了您的问题,您希望
Item::foo
成为指向不带参数的函数的数据成员,并按值返回
F
。您现在拥有的是一个成员函数
foo
的声明,它不带任何参数,并返回
F*
。将定义更改为:

template<typename F>
struct Item
{
  F (*foo)();
};
模板
结构项
{
F(*foo)();
};
此外,正如sehe在中所说,我认为您必须为
容器::items
数组提供一个大小。初始化器中的lambda需要返回一个值

template<typename F>
const Item<F> Container<F>::items[N] =
{
  {  []() -> F { return F(); } }
};
模板
常量项容器::项[N]=
{
{[]()->F{return F();}
};

报告错误是针对上游开发频道的,而且如果没有维度IYAMI subbmited,成员[]的格式也不正确:@sehe:hx,但是使用[1]语法也会发生同样的事情