2013-10-07 3 views
0

У меня возникли ошибки компилятора в 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; 
} 

GCC сказал:

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>’ 

Clang мастер ГОЛОВА (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 
+0

сообщений об ошибках для восходящего потока каналов Дев, также является членом [] не wellformed без размеров ийам – sehe

+0

Я subbmited Сейчас: http://llvm.org/bugs/show_bug.cgi?id=17500 –

+0

@ sehe: hx, но с синтаксисом [1] происходит одно и то же –

ответ

1

Если я правильно понимаю ваш вопрос, вы хотите Item<F>::foo быть членом данных, который указывает на функция не принимает аргументов и возвращает значение F. Теперь у вас есть объявление функции-члена foo, которая не принимает аргументов и возвращает F *. Измените определение:

template<typename F> 
struct Item 
{ 
    F (*foo)(); 
}; 

Кроме того, как sehe говорит в comments, я думаю, вы должны обеспечить размер для Container<F>::items массива. И лямбда в инициализаторе должна вернуть значение.

template<typename F> 
const Item<F> Container<F>::items[N] = 
{ 
    { []() -> F { return F(); } } 
}; 
Смежные вопросы