Я пытаюсь выяснить, если это требование от зерновой или нет.
Я продолжаю получать сообщения о том, что класс Constructors (по умолчанию) является закрытым, и я привел его по определенной причине.
Однако исходная строка для ошибки, по-видимому, std :: make_shared, а не cereal, для которой требуется конструктор по умолчанию, но он уже является классом-другом и поэтому должен иметь к нему доступ.
/usr/include/c++/4.7/type_traits: In instantiation of ‘struct std::__is_default_constructible_impl<Concept>’:
/usr/include/c++/4.7/type_traits:116:12: required from ‘struct std::__and_<std::__not_<std::is_void<Concept> >, std::__is_default_constructible_impl<Concept> >’
/usr/include/c++/4.7/type_traits:682:12: required from ‘struct std::__is_default_constructible_atom<Concept>’
/usr/include/c++/4.7/type_traits:703:12: required from ‘struct std::__is_default_constructible_safe<Concept, false>’
/usr/include/c++/4.7/type_traits:709:12: required from ‘struct std::is_default_constructible<Concept>’
/usr/local/include/cereal/types/polymorphic.hpp:157:5: required by substitution of ‘template<class Archive, class T> typename std::enable_if<((! std::is_default_constructible<T>::value) && (! has_load_and_allocate<T, Archive>())), bool>::type cereal::polymorphic_detail::serialize_wrapper(Archive&, std::shared_ptr<_Tp2>&, uint32_t) [with Archive = cereal::XMLInputArchive; T = Concept]’
/usr/local/include/cereal/types/polymorphic.hpp:253:5: [ skipping 16 instantiation contexts ]
/usr/include/c++/4.7/bits/shared_ptr_base.h:525:8: required from ‘std::__shared_count<_Lp>::__shared_count(std::_Sp_make_shared_tag, _Tp*, const _Alloc&, _Args&& ...) [with _Tp = SemanticGraph<Concept>; _Alloc = std::allocator<SemanticGraph<Concept> >; _Args = {const char (&)[16]}; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
/usr/include/c++/4.7/bits/shared_ptr_base.h:997:35: required from ‘std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = std::allocator<SemanticGraph<Concept> >; _Args = {const char (&)[16]}; _Tp = SemanticGraph<Concept>; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
/usr/include/c++/4.7/bits/shared_ptr.h:317:64: required from ‘std::shared_ptr<_Tp>::shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = std::allocator<SemanticGraph<Concept> >; _Args = {const char (&)[16]}; _Tp = SemanticGraph<Concept>]’
/usr/include/c++/4.7/bits/shared_ptr.h:599:39: required from ‘std::shared_ptr<_Tp1> std::allocate_shared(const _Alloc&, _Args&& ...) [with _Tp = SemanticGraph<Concept>; _Alloc = std::allocator<SemanticGraph<Concept> >; _Args = {const char (&)[16]}]’
/usr/include/c++/4.7/bits/shared_ptr.h:615:42: required from ‘std::shared_ptr<_Tp1> std::make_shared(_Args&& ...) [with _Tp = SemanticGraph<Concept>; _Args = {const char (&)[16]}]’
/home/alex/projects/Icarus/trunk/Api/ConnectionHandler/../../Processes/Controller/../../Datatypes/Domain/../../Handlers/SemanticNodeFactory/SemanticNodeFactory.hpp:34:82: required from here
/home/alex/projects/Icarus/trunk/Api/ConnectionHandler/../../Processes/Controller/../../Datatypes/Domain/../Episode/../State/../ConceptGraph/../Concept/Concept.hpp:27:5: error: ‘Concept::Concept()’ is private
Может кто-нибудь объяснить мне, почему это происходит, и, что более важно, как это можно решить, кроме как сделать эти конструкторы публичными?
РЕДАКТИРОВАТЬ:
исходящая строка ошибки:
concept_map = std::make_shared<SemanticGraph<Concept>>( "concept_map.xml" );
Где SemanticGraph Ctor является:
SemanticGraph
(
const std::string filename
)
:
_fname ( filename )
{
std::ifstream input( _fname );
if ( input.is_open() )
{
cereal::XMLInputArchive archive( input );
archive( _nodes );
}
}
C ++ раньше не учитывал управление доступом при создании экземпляров шаблонов, за исключением того, что при необходимости выдает ошибку. Компилятор, который вы используете, все еще использует эти правила. Из-за этого ваш класс не считается конструируемым по умолчанию. Вместо этого проверка сама по себе невозможна.
GCC 4.8 и выше поддерживают это. Простая демонстрационная программа, которая успешно работает с 4.8 и не работает с 4.7:
#include <type_traits>
class S { S() {} };
int main() {
return std::is_default_constructible<S>::value;
}
В 4.8 это возвращает 0. В 4.7 это вызывает ошибку во время компиляции.
Чтобы решить эту проблему, убедитесь, что у вас нет конструктора по умолчанию, даже частного. Вы можете добавить фиктивный аргумент в свой конструктор и всегда передавать этот фиктивный аргумент.
Других решений пока нет …