views:

92

answers:

2

I have the following code

int main()
{
    cout << "Please enter your name..." << endl;
    cin >> name;
    cout << "Data type = " << typeid(name).name() << endl;
    cin.get();
    return 0;
}

According to the various textbooks and pieces of documentation I've read about the typeid operator, I should expect to read

"Data type = string"

as the output. Instead, I get the following

class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >

Does anyone have any idea where I'm going wrong? FWIW, I'm using Visual Studio 2010 Professional.

+12  A: 

Nothing is wrong.

Those text books, first of all, should have told you the result of name() is implementation-defined, and could very well be "". Secondly, that type is std::string. The std::string type is just a typedef of std::basic_string with char and friends.

GMan
In general compilers don't think in terms of typedefs, so - for better or worse - compilation errors display the actual types involved. Same with typeid things... you need all the potentially different typedefs for the same type to resolve to the same typeid record, so obviously some version of the real name is the only good choice for `name()`.
Tony
+1  A: 

std::string is an alias for the char specialization of the std::basic_string class template. That mouthful you see output is the full typename including all template parameters.

Steve Townsend