Can't compile source code with string [SOLVED]

On 05/09/2014 at 14:09, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   14 
Platform:   Windows  ;   
Language(s) :     C++  ;

---------
I have, in my code, variables of type String and variables of type string.
I'm using some std:: stuff so I must use string instead of String.
It compiles and works fine on my Mac.
But while trying to compile it in Windows, I get lots of errors and the compilation fails.
Is there anything that can be done?

On 05/09/2014 at 16:49, xxxxxxxx wrote:

Why does it compile without a single complain in Xcode and, in Visual Studio I get dozens of errors?!?

On 05/09/2014 at 18:39, xxxxxxxx wrote:

Are you making string explicit to the std library by using std::string for references?

On 05/09/2014 at 18:46, xxxxxxxx wrote:

I don't know what you mean.
Can you give me an example?

On 05/09/2014 at 18:52, xxxxxxxx wrote:

std is a namespace.  You can declare the namespace for referencing objects in that space explicitly (std::space) or implicitly (using namespace std) somewhere at the top of the file.  Which to use will depend on if there are possible clashes.  Let's say you have a string type in std and another in another namespace included in your code.  If they are not explicitly declared, there is a chance that the compiler doesn't understand which one to use.  If you are just using 'string', you must add 'using namespace std'.

On 06/09/2014 at 14:54, xxxxxxxx wrote:

Thank you so much, Robert.
What was happening was the I had these two lines:

  
template <typename T> string tostr(const T& t) { ostringstream os; os<<t; return os.str(); }   
using namespace std;   

and I simply had to switch them, like this:

  
using namespace std;   
template <typename T> string tostr(const T& t) { ostringstream os; os<<t; return os.str(); }   

The correct way is the second, of course. But it is weird that Xcode doesn't complain and makes it work, somehow.

On 06/09/2014 at 15:59, xxxxxxxx wrote:

Technically, you can declare 'using namespace' anywhere in the global scope of the source code.  You can do this with '#include" for headers as well.  It is generally safer to do these first nonetheless.  And you want to declare the namespace after any header that defines it (!).

On 07/09/2014 at 09:29, xxxxxxxx wrote:

All what Kuroyume wrote. However, I would encourage you to not use "using namespace x" but instead use x::function. This avoids any library conflicts.

On 07/09/2014 at 12:28, xxxxxxxx wrote:

Agreed! 🙂

On 07/09/2014 at 12:56, xxxxxxxx wrote:

Thank you all. I will take that into account in the future.
In the meanwhile, I could make it all work now.