#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
конструктору нужен conststringstream
? (Используйтеstatic_cast
, если вам это отчаянно нужно, но, скорее всего, нет.)3. Я присоединяюсь к недоумению. Не могу сделать с a многого
const stringstream
, чего вы не могли бы сделать с aconst string
. Пожалуйста, больше контекста, иначе наши ответы могут устранить ошибку компилятора и поставить вас в худшее положение во время выполнения.4. Я не специалист по C , мне просто нужно отладить это, чтобы иметь возможность скомпилировать его для создания рецепта Conda. Итак, я не знаком с тем, что вы говорите, но я постараюсь разобраться в этом.
5. Предполагая, что сигнатурой конструктора CSimpleException является CSimpleException (char const*, int, std:stringstream constamp;), макрос is действительно должен работать в c 14. Итак, это, вероятно, ошибка компилятора. Какой компилятор вы используете?