Hi,
First, thank you for the good work.
I've tried to install CubicSDR on a debian machine using the install guide from:
https://github.com/cjcliffe/CubicSDR/wiki/Build-Linux
Everything is fine until the step: build$ make under Build CubicSDR, when I got a scary error message. (I've put it in the end of this post).
Based on this stackoverflow answer:
http://stackoverflow.com/questions/6489351/nested-name-specifier
I've removed typename keyword from CubicSDR/src/process/VisualProcessor.h and the build succeeded (See git diff in the end of the post). Still, gcc is complaining about other stuff and displaying some warnings.
I dont know if I need to fork and do a pull request to have this issue resolved.
What do you think?
Thank you in advance.
Error message:
~/CubicSDR/CubicSDR/build$ make
Scanning dependencies of target CubicSDR
[ 1%] Building CXX object CMakeFiles/CubicSDR.dir/external/rtaudio/RtAudio.cpp.o
[ 2%] Building CXX object CMakeFiles/CubicSDR.dir/src/CubicSDR.cpp.o
In file included from /home/ab/CubicSDR/CubicSDR/src/process/ScopeVisualProcessor.h:6:0,
from /home/ab/CubicSDR/CubicSDR/src/visual/ScopeCanvas.h:13,
from /home/ab/CubicSDR/CubicSDR/src/AppFrame.h:15,
from /home/ab/CubicSDR/CubicSDR/src/CubicSDR.h:22,
from /home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp:17:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:15:22: error: expected nested-name-specifier
typedef typename ThreadQueue<InputDataType*> VisualInputQueueType;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:15:50: error: invalid declarator before ‘VisualInputQueueType’
typedef typename ThreadQueue<InputDataType*> VisualInputQueueType;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:16:22: error: expected nested-name-specifier
typedef typename ThreadQueue<OutputDataType*> VisualOutputQueueType;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:16:51: error: invalid declarator before ‘VisualOutputQueueType’
typedef typename ThreadQueue<OutputDataType*> VisualOutputQueueType;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:17:35: error: ‘VisualOutputQueueType’ was not declared in this scope
typedef typename std::vector< VisualOutputQueueType *>::iterator outputs_i;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:17:58: error: template argument 1 is invalid
typedef typename std::vector< VisualOutputQueueType *>::iterator outputs_i;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:17:58: error: template argument 2 is invalid
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:17:59: error: expected identifier before ‘::’ token
typedef typename std::vector< VisualOutputQueueType *>::iterator outputs_i;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:17:61: error: typedef name may not be a nested-name-specifier
typedef typename std::vector< VisualOutputQueueType *>::iterator outputs_i;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:17:61: error: expected ‘;’ at end of member declaration
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:17:70: error: ‘outputs_i’ does not name a type
typedef typename std::vector< VisualOutputQueueType *>::iterator outputs_i;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:52:19: error: ‘VisualInputQueueType’ has not been declared
void setInput(VisualInputQueueType *vis_in) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:60:23: error: ‘VisualOutputQueueType’ has not been declared
void attachOutput(VisualOutputQueueType *vis_out) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:67:23: error: ‘VisualOutputQueueType’ has not been declared
void removeOutput(VisualOutputQueueType *vis_out) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:116:5: error: ‘VisualInputQueueType’ does not name a type
VisualInputQueueType *input = nullptr;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:119:17: error: ‘VisualOutputQueueType’ was not declared in this scope
std::vector<VisualOutputQueueType *> outputs;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:119:40: error: template argument 1 is invalid
std::vector<VisualOutputQueueType *> outputs;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:119:40: error: template argument 2 is invalid
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h: In member function ‘bool VisualProcessor<InputDataType, OutputDataType>::isInputEmpty()’:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:26:16: error: ‘input’ was not declared in this scope
return input->empty();
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h: In member function ‘bool VisualProcessor<InputDataType, OutputDataType>::isOutputEmpty()’:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:32:14: error: ‘outputs_i’ was not declared in this scope
for (outputs_i it = outputs.begin(); it != outputs.end(); it++) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:32:46: error: ‘it’ was not declared in this scope
for (outputs_i it = outputs.begin(); it != outputs.end(); it++) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:32:60: error: request for member ‘end’ in ‘((VisualProcessor<InputDataType, OutputDataType>*)this)->VisualProcessor<InputDataType, OutputDataType>::outputs’, which is of non-class type ‘int’
for (outputs_i it = outputs.begin(); it != outputs.end(); it++) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h: In member function ‘bool VisualProcessor<InputDataType, OutputDataType>::isAnyOutputEmpty()’:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:43:14: error: ‘outputs_i’ was not declared in this scope
for (outputs_i it = outputs.begin(); it != outputs.end(); it++) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:43:47: error: ‘it’ was not declared in this scope
for (outputs_i it = outputs.begin(); it != outputs.end(); it++) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:43:61: error: request for member ‘end’ in ‘((VisualProcessor<InputDataType, OutputDataType>*)this)->VisualProcessor<InputDataType, OutputDataType>::outputs’, which is of non-class type ‘int’
for (outputs_i it = outputs.begin(); it != outputs.end(); it++) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h: In member function ‘void VisualProcessor<InputDataType, OutputDataType>::setInput(int*)’:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:54:9: error: ‘input’ was not declared in this scope
input = vis_in;
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h: In member function ‘void VisualProcessor<InputDataType, OutputDataType>::attachOutput(int*)’:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:63:17: error: request for member ‘push_back’ in ‘((VisualProcessor<InputDataType, OutputDataType>*)this)->VisualProcessor<InputDataType, OutputDataType>::outputs’, which is of non-class type ‘int’
outputs.push_back(vis_out);
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h: In member function ‘void VisualProcessor<InputDataType, OutputDataType>::removeOutput(int*)’:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:71:9: error: ‘outputs_i’ was not declared in this scope
outputs_i i = std::find(outputs.begin(), outputs.end(), vis_out);
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:72:13: error: ‘i’ was not declared in this scope
if (i != outputs.end()) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:72:26: error: request for member ‘end’ in ‘((VisualProcessor<InputDataType, OutputDataType>*)this)->VisualProcessor<InputDataType, OutputDataType>::outputs’, which is of non-class type ‘int’
if (i != outputs.end()) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:73:21: error: request for member ‘erase’ in ‘((VisualProcessor<InputDataType, OutputDataType>*)this)->VisualProcessor<InputDataType, OutputDataType>::outputs’, which is of non-class type ‘int’
outputs.erase(i);
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h: In member function ‘void VisualProcessor<InputDataType, OutputDataType>::run()’:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:82:13: error: ‘input’ was not declared in this scope
if (input && !input->empty()) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h: In member function ‘void VisualProcessor<InputDataType, OutputDataType>::distribute(OutputDataType*)’:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:103:40: error: request for member ‘size’ in ‘((VisualProcessor<InputDataType, OutputDataType>*)this)->VisualProcessor<InputDataType, OutputDataType>::outputs’, which is of non-class type ‘int’
item->setRefCount((int)outputs.size());
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:104:14: error: ‘outputs_i’ was not declared in this scope
for (outputs_i it = outputs.begin(); it != outputs.end(); it++) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:104:46: error: ‘it’ was not declared in this scope
for (outputs_i it = outputs.begin(); it != outputs.end(); it++) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:104:60: error: request for member ‘end’ in ‘((VisualProcessor<InputDataType, OutputDataType>*)this)->VisualProcessor<InputDataType, OutputDataType>::outputs’, which is of non-class type ‘int’
for (outputs_i it = outputs.begin(); it != outputs.end(); it++) {
^
/home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp: In member function ‘virtual bool CubicSDR::OnInit()’:
/home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp:299:54: error: no matching function for call to ‘SpectrumVisualProcessor::setInput(DemodulatorThreadInputQueue*&)’
getSpectrumProcessor()->setInput(pipeIQVisualData);
^
/home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp:299:54: note: candidate is:
In file included from /home/ab/CubicSDR/CubicSDR/src/process/ScopeVisualProcessor.h:6:0,
from /home/ab/CubicSDR/CubicSDR/src/visual/ScopeCanvas.h:13,
from /home/ab/CubicSDR/CubicSDR/src/AppFrame.h:15,
from /home/ab/CubicSDR/CubicSDR/src/CubicSDR.h:22,
from /home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp:17:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:52:10: note: void VisualProcessor<InputDataType, OutputDataType>::setInput(int*) [with InputDataType = DemodulatorThreadIQData; OutputDataType = SpectrumVisualData]
void setInput(VisualInputQueueType *vis_in) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:52:10: note: no known conversion for argument 1 from ‘DemodulatorThreadInputQueue* {aka ThreadQueue<DemodulatorThreadIQData*>*}’ to ‘int*’
/home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp:319:48: error: no matching function for call to ‘ScopeVisualProcessor::setInput(DemodulatorThreadOutputQueue*&)’
scopeProcessor.setInput(pipeAudioVisualData);
^
/home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp:319:48: note: candidate is:
In file included from /home/ab/CubicSDR/CubicSDR/src/process/ScopeVisualProcessor.h:6:0,
from /home/ab/CubicSDR/CubicSDR/src/visual/ScopeCanvas.h:13,
from /home/ab/CubicSDR/CubicSDR/src/AppFrame.h:15,
from /home/ab/CubicSDR/CubicSDR/src/CubicSDR.h:22,
from /home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp:17:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:52:10: note: void VisualProcessor<InputDataType, OutputDataType>::setInput(int*) [with InputDataType = AudioThreadInput; OutputDataType = ScopeRenderData]
void setInput(VisualInputQueueType *vis_in) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:52:10: note: no known conversion for argument 1 from ‘DemodulatorThreadOutputQueue* {aka ThreadQueue<AudioThreadInput*>*}’ to ‘int*’
/home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp:330:68: error: no matching function for call to ‘SpectrumVisualProcessor::setInput(DemodulatorThreadInputQueue*&)’
getDemodSpectrumProcessor()->setInput(pipeDemodIQVisualData);
^
/home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp:330:68: note: candidate is:
In file included from /home/ab/CubicSDR/CubicSDR/src/process/ScopeVisualProcessor.h:6:0,
from /home/ab/CubicSDR/CubicSDR/src/visual/ScopeCanvas.h:13,
from /home/ab/CubicSDR/CubicSDR/src/AppFrame.h:15,
from /home/ab/CubicSDR/CubicSDR/src/CubicSDR.h:22,
from /home/ab/CubicSDR/CubicSDR/src/CubicSDR.cpp:17:
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:52:10: note: void VisualProcessor<InputDataType, OutputDataType>::setInput(int*) [with InputDataType = DemodulatorThreadIQData; OutputDataType = SpectrumVisualData]
void setInput(VisualInputQueueType *vis_in) {
^
/home/ab/CubicSDR/CubicSDR/src/process/VisualProcessor.h:52:10: note: no known conversion for argument 1 from ‘DemodulatorThreadInputQueue* {aka ThreadQueue<DemodulatorThreadIQData*>*}’ to ‘int*’
CMakeFiles/CubicSDR.dir/build.make:77: recipe for target 'CMakeFiles/CubicSDR.dir/src/CubicSDR.cpp.o' failed
make[2]: *** [CMakeFiles/CubicSDR.dir/src/CubicSDR.cpp.o] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/CubicSDR.dir/all' failed
make[1]: *** [CMakeFiles/CubicSDR.dir/all] Error 2
Makefile:117: recipe for target 'all' failed
make: *** [all] Error 2
Git diff output:
diff --git a/src/process/VisualProcessor.h b/src/process/VisualProcessor.h
index a385f4c..57a78d0 100644
--- a/src/process/VisualProcessor.h
+++ b/src/process/VisualProcessor.h
@@ -12,8 +12,8 @@
template<typename InputDataType = ReferenceCounter, typename OutputDataType = ReferenceCounter>
class VisualProcessor {
//
- typedef typename ThreadQueue<InputDataType*> VisualInputQueueType;
- typedef typename ThreadQueue<OutputDataType*> VisualOutputQueueType;
+ typedef ThreadQueue<InputDataType*> VisualInputQueueType;
+ typedef ThreadQueue<OutputDataType*> VisualOutputQueueType;
typedef typename std::vector< VisualOutputQueueType *>::iterator outputs_i;
public:
virtual ~VisualProcessor() {
@abousselmi I'll take a look, and try to revert somechanges I've made on template syntax, trying your suggestion. I work with Visual C++ 2017, but I didn't try other targets. The trick is to have a template syntax accepted by all compilers. Damn you C++ ! :-1:
I can confirm that I had the same issue as @abousselmi. His patch allows for the build to finish. I'm using GCC 6.3.1 on Arch Linux.
@abousselmi , @mirrornoir Thank you for your input ! I tried @abousselmi change, and MSVC compile and run it fine, so I've comited the change on the master branch.
@vsonnier @mirrornoir Thank you :)
Most helpful comment
@abousselmi , @mirrornoir Thank you for your input ! I tried @abousselmi change, and MSVC compile and run it fine, so I've comited the change on the master branch.