dynamic_cast из rvalue в ссылочный тип

#c

#c

Вопрос:

У меня есть это функция макрос в файле hpp:

 #define THROW_SIMPLE(a) throw CSimpleException(__FILE__, __LINE__, dynamic_cast<const stringstreamamp; > (stringstream() << a))
  

При компиляции всего пакета с помощью c 14 я получаю эту ошибку:

 INFO (ERR) cdalignproc_base.cpp:104:3: error: dynamic_cast from rvalue to reference type 'const std::__1::stringstream amp;' (aka 'const basic_stringstream<char> amp;')
INFO (ERR)                 THROW_SIMPLE("Cannot sort reading frames - query sequence length unknown");
  

Есть ли способ изменить эту функцию, чтобы она продолжала вести себя должным образом и правильно компилировалась?
Любая помощь очень ценится. Спасибо

  • Редактировать

Для большего контекста здесь приведены вызовы этого макроса:

 ./common/basealgo.cpp       THROW_SIMPLE("Input stream error: Cannot read"); 
./common/cdalignproc_base.cpp       THROW_SIMPLE("Cannot sort reading frames - query sequence length unknown");  
./common/basedata.cpp   //  THROW_SIMPLE("Invalid Pdb ID string " << acxn);             
                    THROW_SIMPLE("Motif string parse error -- Motif = " << m_strMotif << ", error position: " << errPos);
                    THROW_SIMPLE("Invalid protein length " << aaLen << ": shorter than aligned range " << alignedLen)
  
  • Правка2

Команда компиляции выглядит следующим образом:

 x86_64-apple-darwin13.4.0-clang    -stdlib=libc   -std=gnu  14 -c  -Wall -Wno-format-y2k -m64 -fpascal-strings  -fopenmp -march=core2 -mtune=haswell -mssse3 -ftree-vectorize -fPIC -fPIE -fstack-protector-strong -O2 -pipe -stdlib=libc   -fvisibility-inlines-hidden -std=c  14 -fmessage-length=0 -isystem $PREFIX/include -fdebug-prefix-map=$SRC_DIR=/usr/local/src/conda/blast-2.10.1 -fdebug-prefix-map=$PREFIX=/usr/local/src/conda-prefix -O2 -Wno-deprecated-register -fno-common   -D__DB_OFFLINE__ -I. -DNDEBUG -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -m64 -D_FORTIFY_SOURCE=2 -mmacosx-version-min=10.9 -isystem $PREFIX/include -I$PREFIX/include -D_MT -D_REENTRANT -D_THREAD_SAFE -I$SRC_DIR/blast/c  /ReleaseMT/inc -I$SRC_DIR/blast/c  /include  -DNCBI_APP_BUILT_AS=rpsbproc -DNCBI_BUILD_SESSION_ID=5E6DA050-CCF1-4170-BF1A-EC777D1B7288 $SRC_DIR/blast/c  /src/app/RpsbProc/common/offl_sparcle_data.cpp -o common/offl_sparcle_data.o
  
  • Правка 3

Я пытался

 #define THROW_SIMPLE(a) throw CSimpleException(__FILE__, __LINE__, dynamic_cast<stringstreamamp; > (stringstream() << a))
  

Но получаю ошибку:

 01:35:34 BIOCONDA INFO (ERR) /Users/distiller/project/miniconda/conda-bld/blast_1600674036922/work/blast/c  /src/app/RpsbProc/common/cdalignproc_base.cpp:104:3: error: dynamic_cast from rvalue to reference type 'std::__1::stringstream amp;' (aka 'basic_stringstream<char> amp;')
01:35:34 BIOCONDA INFO (ERR)                 THROW_SIMPLE("Cannot sort reading frames - query sequence length unknown");
01:35:34 BIOCONDA INFO (ERR)                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
01:35:34 BIOCONDA INFO (ERR) /Users/distiller/project/miniconda/conda-bld/blast_1600674036922/work/blast/c  /src/app/RpsbProc/common/normbase.hpp:145:68: note: expanded from macro 'THROW_SIMPLE'
01:35:34 BIOCONDA INFO (ERR) #define THROW_SIMPLE(a) throw CSimpleException(__FILE__, __LINE__, dynamic_cast<stringstreamamp; > (stringstream() << a))
  
  • Правка 4

Я пытался

 #define THROW_SIMPLE(a) throw CSimpleException(__FILE__, __LINE__, stringstream(a))
  

Но получаю ошибку:

 02:07:13 BIOCONDA INFO (ERR) /Users/distiller/project/miniconda/conda-bld/blast_1600848608737/work/blast/c  /src/app/RpsbProc/common/basedata.cpp:466:56: error: invalid operands to binary expression ('const char [37]' and 'const std::string' (aka 'const basic_string<char, char_traits<char>, allocator<char> >'))
02:07:13 BIOCONDA INFO (ERR)                         THROW_SIMPLE("Motif string parse error -- Motif = " << m_strMotif << ", error position: " << errPos);
02:07:13 BIOCONDA INFO (ERR)                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~
02:07:13 BIOCONDA INFO (ERR) /Users/distiller/project/miniconda/conda-bld/blast_1600848608737/work/blast/c  /src/app/RpsbProc/common/normbase.hpp:145:81: note: expanded from macro 'THROW_SIMPLE'
02:07:13 BIOCONDA INFO (ERR) #define THROW_SIMPLE(a) throw CSimpleException(__FILE__, __LINE__, stringstream(a))
  

Комментарии:

1. Это не функция; это макрос. И почему нельзя SimpleException передать параметры для вывода stringstream самому a?

2.Почему CSimpleException конструктору нужен const stringstream ? (Используйте static_cast , если вам это отчаянно нужно, но, скорее всего, нет.)

3. Я присоединяюсь к недоумению. Не могу сделать с a многого const stringstream , чего вы не могли бы сделать с a const string . Пожалуйста, больше контекста, иначе наши ответы могут устранить ошибку компилятора и поставить вас в худшее положение во время выполнения.

4. Я не специалист по C , мне просто нужно отладить это, чтобы иметь возможность скомпилировать его для создания рецепта Conda. Итак, я не знаком с тем, что вы говорите, но я постараюсь разобраться в этом.

5. Предполагая, что сигнатурой конструктора CSimpleException является CSimpleException (char const*, int, std:stringstream constamp;), макрос is действительно должен работать в c 14. Итак, это, вероятно, ошибка компилятора. Какой компилятор вы используете?