[Bug c++/54905] New: invalid use of qualified-name 'std::cout'

ace.of.zerosync at gmail dot com gcc-bugzilla@gcc.gnu.org
Thu Oct 11 20:35:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54905

             Bug #: 54905
           Summary: invalid use of qualified-name 'std::cout'
    Classification: Unclassified
           Product: gcc
           Version: 4.6.4
            Status: UNCONFIRMED
          Severity: blocker
          Priority: P3
         Component: c++
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: ace.of.zerosync@gmail.com


The code below builds fine with any version of GCC 4.x

########
#include <iostream>

void Test(std::ostream &stream) {
        stream << "Hello, World!" << std::endl;
}

int main() {
        Test(std::cout);
        return 0;
}
########

But
GCC 4.2.1, 4.4.0, 4.6.4 and 4.7.3 refuse to build the below code while VC++10,
VC++11 and both CLANG 3.0 and 3.1 are building it without any issue or warning.

[ I got it from here:
http://stackoverflow.com/questions/8629382/debug-macro-for-c-with-variable-arguments-without-the-format-string
]

########
#include <iostream>
#include <string>

class VariadicToOutputStream
{
public:
    VariadicToOutputStream(std::ostream& s, const std::string& separator = " ")
: m_stream(s), m_hasEntries(false), m_separator(separator) {}
    template<typename ObjectType>
    VariadicToOutputStream& operator , (const ObjectType& v)
    {
        if (m_hasEntries) m_stream << m_separator;
        m_stream << v;
        m_hasEntries=true;
        return *this;
    }
    ~VariadicToOutputStream()
    {
        m_stream << std::endl;
    }

private:
    std::ostream& m_stream;
    bool m_hasEntries;
    std::string m_separator;
};

#define VARIADIC_TO_STDOUT(...)    \
    VariadicToOutputStream(std::cout),__VA_ARGS__;

int main() {
    VARIADIC_TO_STDOUT(1, 0.5f, "a string");
    return 0;
}
########


The error produced by GCC:
########
main.cpp: In function 'int main()':
main.cpp:31:2: error: invalid use of qualified-name 'std::cout'
main.cpp:31:2: error: expected unqualified-id before numeric constant
########


Versions of GCC that I've used:
g++ (GCC) 4.2.1 20070831 patched [FreeBSD]
g++46 (FreeBSD Ports Collection) 4.6.4 20120928 (prerelease)
g++47 (FreeBSD Ports Collection) 4.7.3 20120929 (prerelease)
MinGW g++ (GCC) 4.4.0



More information about the Gcc-bugs mailing list