There is a tutorial JUCE: Tutorial: Looping audio using the AudioSampleBuffer class (advanced)
introducing the usage of the “ScopedTryLockType lock” to keep the thread the safety.
Then I implemented this method and introduced the “using namespace std;” in the same code file.
I got the underneath error after building the code. could anyone give any clues?
error C2228: left of ‘.isLocked’ must have class/struct/union
If the name of your
ScopedTryLockType instance is
lock, and you’ve used
using namespace std;, then you’ve got multiple definitions of
lock (yours, and
std::lock) so the compiler doesn’t know which you intended to use when you say
This is exactly why it’s not recommended to use
using namespace anything;. But if you really want to, you can just rename your
got the idea. really appreciated.
Still have trouble, do you mean to rename the “lock” to another name? it seems do not work.
I put the original code below:
const juce::SpinLock::ScopedTryLockType *lock* (mutex);
Yeah, you’d need to rename your
lock variable to something else to avoid the clash with
const juce::SpinLock::ScopedTryLockType spinLock (mutex);
LoopingAudioSampleBufferAdvancedTutorial_02.h (9.2 KB)
The same error after running the build.
I supplement the code file in which I just modify the variable from “lock”->“spinlock” and add the “using namespace std;” based on the tutorial code.
There’s a lot more things in that file called
lock. You need to go through all of them and rename them.
Or just remove
using namespace std; which would be best practice.
I second what @ImJimmi already suggested, i.e. to remove your
using namespace std; directive, as it is only bound to cause more and more clashes in the future, as the standard library is expanded with new classes.
I’ll add to that also the fact that putting it in a .h is especially bad, because that will cause every cpp code that uses that header file to have the std namespace already “imported”, with the potential to cause name clashes also there.
But there is a middle ground between
using namespace std at the top of a file and having to type
std:: in front of every entity from the standard library: in every scope (i.e. open and closed curly brace) you can for example type
using std::vector;, and in that scope you can simply type
vector instead of
std::vector every time.
This way, you only “import” in each local scope the names that you actually need, avoiding unwanted clashes, and those “imports” are only limited to the area where those names are actually needed, instead of the whole file and the files that #include it.