Следующий код...
// main.cpp
#include <grpcpp/grpcpp.h>
class ClientContextContainer {
public:
ClientContextContainer( int i ) : i_(i) {}
private:
grpc::ClientContext client_context_;
int i_;
};
class ArrayContainer {
public:
ArrayContainer() : ccc_{ {42}, {1138} } {}
private:
ClientContextContainer ccc_[2];
};
int main( int argc, char* argv[] ) {
ArrayContainer ac;
return 0;
}
... генерирует эту ошибку:
root@178258c7c52d:/tmp# /usr/bin/x86_64-linux-gnu-g++ --version && /usr/bin/x86_64-linux-gnu-g++ -c ./main.cpp
x86_64-linux-gnu-g++ (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
./main.cpp: In constructor 'ArrayContainer::ArrayContainer()':
./main.cpp:15:41: error: use of deleted function 'ClientContextContainer::ClientContextContainer(ClientContextContainer&&)'
ArrayContainer() : ccc_{ {42}, {1138} } {}
^
./main.cpp:4:7: note: 'ClientContextContainer::ClientContextContainer(ClientContextContainer&&)' is implicitly deleted because the default definition would be ill-formed:
class ClientContextContainer {
^~~~~~~~~~~~~~~~~~~~~~
./main.cpp:4:7: error: 'grpc::ClientContext::ClientContext(const grpc::ClientContext&)' is private within this context
In file included from /usr/local/include/grpcpp/client_context.h:37,
from /usr/local/include/grpcpp/grpcpp.h:53,
from ./main.cpp:2:
/usr/local/include/grpcpp/impl/codegen/client_context.h:388:3: note: declared private here
ClientContext(const ClientContext&);
^~~~~~~~~~~~~
Я не совсем понимаю ошибку компилятора, но, судя по моему чтению, проблема заключается в том, что конструктор перемещения class ClientContextContainer
неявно удаляется, потому что объект класса grpc::ClientContext
имеет закрытый конструктор копии. (Осмотр client_context.h
показывает, что его оператор присваивания также является закрытым).
Отлично. Но если это так, почему я не могу воспроизвести ошибку компиляции, если заменю объект-член grpc::ClientContext
своим собственным объектом, который также имеет закрытый конструктор копирования (и оператор присваивания)?
// main.cpp
//#include <grpcpp/grpcpp.h>
class FauxClientContext {
public:
FauxClientContext() {}
private:
FauxClientContext( const FauxClientContext& );
FauxClientContext& operator=( const FauxClientContext& );
};
class ClientContextContainer {
public:
ClientContextContainer( int i ) : i_(i) {}
private:
FauxClientContext client_context_;
//grpc::ClientContext client_context_;
int i_;
};
class ArrayContainer {
public:
ArrayContainer() : ccc_{ {42}, {1138} } {}
private:
ClientContextContainer ccc_[2];
};
int main( int argc, char* argv[] ) {
ArrayContainer ac;
return 0;
}
root@178258c7c52d:/tmp# /usr/bin/x86_64-linux-gnu-g++ --version && /usr/bin/x86_64-linux-gnu-g++ -c ./main.cpp
x86_64-linux-gnu-g++ (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
root@178258c7c52d:/tmp#
Какова истинная природа ошибки при компиляции первой версии main.cpp
? Тот факт, что мне удалось успешно скомпилировать вторую версию main.cpp
, подразумевает, что это не то, что я интерпретировал сообщение об ошибке компилятора.
Для тех, кто знаком с grpc
, корень этой строки вопроса таков: можно ли создать массив объектов в списке инициализаторов, если объекты имеют элемент grpc::ClientContext
объект?
private
, а не его реализация. Похоже, чтоgrpc::ClientContext
не предназначен для копирования. - person user4581301   schedule 04.12.2020ClientContextContainer(ClientContextContainer&&) = delete;
к вашему определениюClientContextContainer
проясняет и/или озадачивает. То есть вместо того, чтобы пытаться сделать конструктор перемещения неявно удаленным, сделайте его явным удаленным. Спойлер: он все еще компилируется. - person JaMiT   schedule 04.12.2020