Search code examples
c++templatesvisual-c++-6c1001

VC6 and template error


I am overloading operator << to implement a stream like interface for a class:

template<typename T>
CAudit& operator <<  ( const T& data ) {
    audittext << data;
    return *this;
}

CAudit& operator << ( LPCSTR data ) {
    audittext << data;
    return *this;
}

The template version fails to compile with "fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 1794)". Non-template functions all compile correctly.

Is this due to VC6s deficiencies when handling templates and is there a way around this?

Thanks, Patrick

EDIT :

the full class is:

class CAudit
{
public:    
/* TODO_DEBUG : doesn't build! 
template<typename T>
CAudit& operator <<  ( const T& data ) {
    audittext << data;
    return *this;
}*/

~CAudit() { write(); }//If anything available to audit write it here

CAudit& operator << ( LPCSTR data ) {
    audittext << data;
    return *this;
}

//overload the << operator to allow function ptrs on rhs, allows "audit << data << CAudit::write;"
CAudit& operator << (CAudit & (*func)(CAudit &))
{
    return func(*this);
}

void write() {
}

//write() is a manipulator type func, "audit << data << CAudit::write;" will call this function
static CAudit& write(CAudit& audit) { 
    audit.write();
    return audit; 
}

private:
std::stringstream audittext;
};

The problem occurs with the function overload of operator << which is used to allow write() to be used as a stream manipulator:

CAudit audit
audit << "Billy" << write;

Solution

  • That overload of the template for function pointers surely is too much for good old Visual Studio 6. As a workaround you could define a type for your manipulator and overload operator<< for that type. Here's some code:

    #include "stdafx.h"
    #include <string>
    #include <iostream>
    #include <sstream>
    #include <windows.h>
    
    class CAudit {
    
        std::ostringstream audittext;
        void do_write() {}
    
    public:
        ~CAudit() { do_write(); } 
    
        // types for manipulators
        struct Twrite {};
    
        // manipulators
        static Twrite write;
    
        // implementations of <<
        template<typename T>
            CAudit& operator <<  ( const T& data ) {
            audittext << data;
            return *this;
        }
    
        CAudit& operator <<  ( LPCSTR data ) {
            audittext << data;
            return *this;
        }
    
        CAudit& operator <<  ( Twrite& ) {
            do_write();
            return *this;
        }
    };
    
    // static member initialization
    CAudit::Twrite CAudit::write;
    
    
    
    int main(int argc, char* argv[])
    {
        CAudit a;
        int i = 123;
        const char * s = "abc";
    
        a << i << s << CAudit::write;
    
        return 0;
    }