2009-10-15 35 views
7

Me pregunto si hay una manera de obtener una mejor información sobre la ubicación de un error en msvc (2005)?¿Hay alguna forma de obtener una mejor información para el contexto de un error al usar msvc? (por ejemplo: C2248)

Por ejemplo, cuando la herencia de impulso :: noncopyable en mi clase me sale un error C2248 diciendo algo como:

error C2248: 'boost :: noncopyable _ :: :: noncopyable noncopyable': no ​​se puede acceder miembro privado declarado en clase 'boost :: noncopyable _ :: noncopyable'. Este diagnóstico se produjo en la función compilador genera 'MyClass :: MyClass (const myClass &)'

pero deja de decirme dónde exactamente el constructor de copia se llama. Esto es un poco molesto Realmente no estoy seguro, pero creo que recuerdo haber visto una configuración en algún lugar donde podía especificar el nivel de salida o algo así, pero busqué y no encontré nada, así que mi pregunta es: ¿Hay alguna forma de obtener un mensaje de error mejor (más completo) en msvc? ?

Editar: Bueno, ya que stackoverflow me acaba de decir que debo buscar para aceptar una respuesta, me preguntaba si alguien podría decir si msvc 2008/2010 da un mejor diagnóstico para este error? Alguien también mencionó que GCC debería hacerlo, ¿alguien puede confirmar esto? ¿Qué pasa con otros compiladores (Intel ?, Comeau?)

Gracias

+2

Me he encontrado con esa antes también. Tal vez valdría la pena informarlo en connect.microsoft.com – jalf

+0

Parece que ya se informó y se cerró como de costumbre porque no se consideró lo suficientemente importante. Gracias por el enlace que no sabía sobre esto. Parece que puede ser útil. – n1ckp

+0

Aquí está el enlace de conexión si alguien le importa a votar hacia arriba: https://connect.microsoft.com/VisualStudio/feedback/details/467747/compiler-shows-error-but-with-no-hint-to-the -usuarios-código-fuente. Acabo de tener un problema similar con un punto y coma faltante al final de una definición de clase y vs no me daría ninguna pista útil en el error. – n1ckp

Respuesta

4

Puedo confirmar con Code :: Blocks y VC++ 2005, que no da indicios de dónde se produce el error. Tampoco lo hace declarar su propio constructor copia privada ayuda.

#include <boost/noncopyable.hpp> 

class X: boost::noncopyable 
{ 
}; 

void foo(X x) {} 

int main() 
{ 

    X x; 
    foo(x); 
} 

El registro de compilación (la línea cinco es la última línea de la declaración de la clase):

main.cpp(5) : error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable' This diagnostic occurred in the compiler generated function 'X::X(const X &)'

menos que haya un modificador de compilador para permitir el diagnóstico de errores más a fondo, este wouldn No es la primera vez que simplemente compilo el archivo con GCC (MinGW) para obtener un diagnóstico de error más útil. (Por desgracia, su código debe estar libre de extensiones de VC++.)

+0

no se acordaron de que O nordeste. Al menos uno puede adivinar bastante rápido cuál es el problema con no copiable. –

+0

El problema no es con noncopyable. El problema es que * tu * código intenta copiar algo que no debería estar copiando. – UncleBens

+1

Eso es lo que quise decir. Al usar no copiable, al menos puede averiguar rápidamente lo que significa, a diferencia de otros casos de uso. Tampoco hay ningún interruptor útil cl.exe que arroje más luz sobre esto. –

-1

En la ventana de salida o la acumulación de registro debería ver donde el compilador trató de usar la plantilla en su código ... usted tiene que desplazarse alrededor un poco sin embargo.

Si no hay suficiente información en los registros de construcción, también hay una opción para controlar la verbosidad msbuild:
Herramientas-> Opciones-> Proyectos y Soluciones> Crecimiento y Run-> MSBuild verbosidad de resultados del proyecto

+0

Esto fue exactamente las opciones que estaba pensando en que van a tratar de ver si se dan más información e informar Gracias – n1ckp

+2

he intentado, por desgracia, no ayuda -.... Véase la respuesta UncleBens –

0

Puede crear temporalmente un constructor de copia manual (con la misma firma) y la implementación predeterminada, solo con el propósito de rastrear este error ...? No estoy seguro de si eso lo haría más fácil de encontrar.

+0

Mi pregunta es no relacionado con este error en particular. Mi error actual no está relacionado con un constructor de copia. Eso fue un ejemplo. Aún así, gracias por contestar. – n1ckp

-1

Abra la ventana de salida, donde se muestra el registro de construcción completo. Compruebe allí el mensaje de error. Debajo de ese mensaje de error, generalmente puede encontrar más información que puede ayudarlo a rastrear el origen del problema.

Si hace doble clic en el problema en la lista de errores y va a la ventana de salida, el cursor se colocará en ese mensaje de error.

+0

Hmm yo sabía que debería haber copiar/pegar la cadena completa para que no piensa que tengo esto desde las ventanas de error. Lo obtuve de las ventanas de salida y la única referencia que encontré para encontrar el error es el archivo .cpp donde ocurrió el error, pero me gustaría saber la ubicación de la llamada al constructor de copia o cualquier otro información que pueda conseguir. Gracias de todos modos. – n1ckp

+0

con plantillas que por lo general tiene que desplazarse hacia abajo más allá de algún 'ruido' para llegar a la parte donde se menciona la fuente. –

0

En realidad, la mejor manera de solucionar este (VS2013 aquí) parece que trepar por la ventana de salida de forma iterativa:

1/cuando llegue el mensaje "Este diagnóstico se produjo en la función compilador genera 'X :: X (const X &) '" en la salida, vaya a su 'clase X' y eliminar explícitamente el constructor de copia mediante el C++ 11 notación: "X (const X &) = borrar;"

2/vuelva a compilar, ahora el resultado debe mostrar el mismo error pero con un diagnóstico en clases secundarias, luego vuelva al paso 1 para eliminar explícitamente el constructor de copia en la clase secundaria, hasta llegar al verdadero defecto clase ...

Cuestiones relacionadas