Pregunta

Yo soy la sobrecarga del operador << para implementar un stream como interfaz para una clase:

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

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

La versión de la plantilla de falla al compilar con "error grave C1001:ERROR INTERNO del COMPILADOR (archivo del compilador 'msc1.cpp', de la línea de 1794)".No de la plantilla de las funciones de todos los compilar correctamente.

Es esto debido a VC6s deficiencias en el manejo de plantillas y hay una forma de evitar esto?

Gracias, Patrick

EDITAR :

el pleno de la clase es:

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;
};

El problema se produce con la función de sobrecarga del operador << que se utiliza para permitir write() para ser utilizado como una secuencia de manipulador:

CAudit audit
audit << "Billy" << write;
¿Fue útil?

Solución

Esa sobrecarga de la plantilla para los punteros de la función seguramente es demasiado para el buen estudio Visual 6. Como solución alternativa, puede definir un tipo para su operador de manipulador y sobrecarga << para ese tipo. Aquí hay algún código:

#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;
}

Otros consejos

El tipo de error definitivamente parece que el tipo de accidentes causados por VC6 pre-anterior-norma de ejecución de las plantillas.

El mejor consejo es, por supuesto, para la actualización a VC7.0, 7.1, 8.0, 9.0 o la beta de 10.Para comparar que a las versiones de Windows, sigue usando Windows 98, Me, 2000, XP, Vista y 7 están disponibles.

Habiendo dicho esto, usted puede simplificar la búsqueda de un sorteo por un simple truco:

class CAudit {
    template<typename T>
    CAudit& operator<<(T const& t) {
        this->print(t);
        return *this;
    }
private:
    void print(int);
    void print(LPCSTR);
    void print(CAudit & (*func)(CAudit &));
    template<typename T> print(T const&);
};

La esperanza aquí es que la primera búsqueda de operator<< encuentra el único miembro de la plantilla.El otro operator<< los candidatos no son miembros de otras clases y construido-ins.Deben ser claramente peor que esta plantilla.La segunda búsqueda en el interior de su operator sólo necesita tratar con CAudit los miembros de la llamada print.

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

EDITAR:

#include <iostream>
using namespace std;

class CAudit{
public:
    CAudit(){}

    template< typename T >
    CAudit &operator<<(T arg);
    CAudit &operator<<(char s);
};

template< typename T>
void oldLog(T arg){
  cout << arg;
}

template< typename T >
CAudit &CAudit::operator<<(T arg){
    oldLog( arg );
    return *this;
}
CAudit &CAudit::operator<<(char arg){
    oldLog( arg );
    return *this;
}
int main(){

    CAudit e;
    e << "Hello";
    e << 'T';

 return 0;
}

El problema no parece estar en el fragmento de código que publicó. Este programa funciona bien:

#include "stdafx.h"
#include <string>
#include <iostream>
#include <sstream>
#include <windows.h>

class CAudit {

std::ostringstream audittext;

public:
std::string getAuditText() const { return audittext.str(); }

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


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

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


int main(int argc, char* argv[])
{
CAudit a;
int i = 123;
const char * s = "abc";

a << i;
a << s;

std::cout << "audittext is: '" << a.getAuditText() << "'\n";
return 0;
}

¿Podrías publicar más código?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top