DescribeStreamOutcome сообщается как неполный тип

Я клонировал aws-sdk-cpp с github и у меня получилось собрать без проблем (тесты тоже прошли). Я не делал "установить". Я хотел скомпилировать часть SDK исключительно для dynamodbstreams, поэтому добавил -DBUILD_ONLY="dynamodbstreams" в параметры cmake. Я написал небольшой тестовый код, но он не компилируется из-за типа DescribeStreamOutcome, который, как сообщается, не определен ("незавершенный тип"). Однако он существует в заголовочном файле там, где должен быть.

версия cmake: 3.5.1, версия g++: 5.4.0 (я пока не пробовал clang)

Может ли кто-нибудь посмотреть коды и указать, что не так?

У меня есть следующий код:

#include "aws/core/Aws.h"
#include "aws/dynamodbstreams/DynamoDBStreamsClient.h"
#include "aws/dynamodbstreams/model/DescribeStreamRequest.h"

int main()
{
    Aws::SDKOptions options;
    Aws::InitAPI(options);

    Aws::DynamoDBStreams::DynamoDBStreamsClient client;
    Aws::DynamoDBStreams::Model::DescribeStreamRequest request;
    auto result = client.DescribeStream(request);
    if (result.IsSuccess()) {}

    Aws::ShutdownAPI(options);

    return 0;
}

С этим Makefile:

all: test

CFLAGS = -std=c++11 -Wall -fPIC \
-I$(SDK_SOURCE_DIR)/aws-cpp-sdk-core/include \
-I$(SDK_SOURCE_DIR)/aws-cpp-sdk-dynamodbstreams/include

LFLAGS = -shared -fPIC \
-L$(SDK_BUILD_DIR)/aws-cpp-sdk-core -laws-cpp-sdk-core \
-L$(SDK_BUILD_DIR)/aws-cpp-sdk-dynamodbstreams -laws-cpp-sdk-dynamodbstreams

test: test.o \
     $(CXX) -shared -fPIC -o $@ $^

test.o: test.cc
     $(CXX) $(CFLAGS) -c -o $@ $<

.PHONY: clean
clean:
     rm -f *.o test

При создании я получаю следующую ошибку:

g++ -std=c++11 -Wall -fPIC -I/home/attilacsabai/git-projects/aws-sdk-cpp/aws-cpp-sdk-core/include -I/home/attilacsabai/git-projects/aws-sdk-cpp/aws-cpp-sdk-dynamodbstreams/include -c -o test.o test.cc
test.cc: In function ‘int main()’:
test.cc:12:48: error: invalid use of incomplete type ‘Aws::DynamoDBStreams::Model::DescribeStreamOutcome {aka class Aws::Utils::Outcome<Aws::DynamoDBStreams::Model::DescribeStreamResult, Aws::Client::AWSError<Aws::DynamoDBStreams::DynamoDBStreamsErrors> >}’
     auto result = client.DescribeStream(request);
                                                ^
In file included from /home/attilacsabai/git-projects/aws-sdk-cpp/aws-cpp-sdk-core/include/aws/core/utils/crypto/Hash.h:19:0,
                 from /home/attilacsabai/git-projects/aws-sdk-cpp/aws-cpp-sdk-core/include/aws/core/client/AWSClient.h:23,
                 from /home/attilacsabai/git-projects/aws-sdk-cpp/aws-cpp-sdk-dynamodbstreams/include/aws/dynamodbstreams/DynamoDBStreamsClient.h:21,
                 from test.cc:2:
/home/attilacsabai/git-projects/aws-sdk-cpp/aws-cpp-sdk-core/include/aws/core/utils/crypto/HashResult.h:26:50: note: declaration of ‘Aws::DynamoDBStreams::Model::DescribeStreamOutcome {aka class Aws::Utils::Outcome<Aws::DynamoDBStreams::Model::DescribeStreamResult, Aws::Client::AWSError<Aws::DynamoDBStreams::DynamoDBStreamsErrors> >}’
         template< typename R, typename E > class Outcome;
                                                  ^
Makefile:16: recipe for target 'test.o' failed
make: *** [test.o] Error 1

Однако DescribeStreamOutcome определен в DynamoDBStreamsClient.h:

$ grep -i describestreamoutcome $SDK_SOURCE_DIR/aws-cpp-sdk-dynamodbstreams/include/aws/dynamodbstreams/DynamoDBStreamsClient.h | head -1
typedef Aws::Utils::Outcome<DescribeStreamResult, Aws::Client::AWSError<DynamoDBStreamsErrors>> DescribeStreamOutcome;

Не могли бы вы мне помочь? Спасибо.


person Attila Csabai    schedule 08.10.2017    source источник


Ответы (1)


Утверждение «DescribeStreamOutcome определено в DynamoDBStreamsClient.h» неверно. Эта строка в DynamoDBStreamsClient.h определяет псевдоним экземпляра Outcome.

clang дает несколько более краткое сообщение об ошибке:

meow.cpp:12:26: error: implicit instantiation of undefined template 'Aws::Utils::Outcome<Aws::DynamoDBStreams::Model::DescribeStreamResult,
      Aws::Client::AWSError<Aws::DynamoDBStreams::DynamoDBStreamsErrors> >'
    auto result = client.DescribeStream(request);
                         ^
/usr/local/include/aws/dynamodbstreams/DynamoDBStreamsClient.h:44:43: note: template is declared here
  template< typename R, typename E> class Outcome;
                                          ^

Вам нужно #include "aws/core/utils/Outcome.h"

Возможно, aws/dynamodbstreams/DynamoDBStreamsClient.h должен был включать Outcome.h, хотя код, использующий DynamoDBStreamsClient, компилируется без него, если вы не вызываете ни один из методов, возвращающих результат.

person Bulletmagnet    schedule 04.12.2017