Error: Generar errores en tipos de devolución no anular para plantilla de función friend

Seleccione idioma Seleccione idioma
Id. de artículo: 246891 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Síntomas

Al generar una aplicación que tiene una función de plantilla friend en una clase nontemplated, puede ver los mensajes de error siguientes:
el error C2440: '=': no se puede convertir de 'void 'a' tipo'
Las expresiones de tipo void no se puede convertir a otros tipos.
o
error LNK2001: símbolo externo sin resolver "void __cdecl Test(int)" (? Test@@YAXH@Z)
Consulte el ejemplo de la sección "Más información" para obtener detalles.

Causa

El compilador y vinculador esperan un void tipo de valor devuelto.

Solución

Utilice uno de las dos soluciones siguientes:
  • Incluir la implementación de función de plantilla friend en el archivo de encabezado o en archivo de código fuente principal.
  • Cambiar el tipo devuelto de la plantilla de función friend para anular . Si tipo de valor devuelto es importante, páselo como referencia.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados al principio de este artículo.

Más información

Hay dos escenarios en que se produce este error.
  • Caso 1: Cuando el tipo devuelto de la plantilla de función friend se asigna a una variable, el compilador genera un error C2440.
  • Caso 2: Si no se utiliza el tipo devuelto de la plantilla de función amigo , a continuación, LNK2001 se produce un error por el vinculador.

Pasos para reproducir este comportamiento

En el ejemplo siguiente se muestra el error:

Crear tres archivos y compilar con: cl main.cpp file.cpp

  • File.h
  • File.cpp
  • Main.cpp
class A
{
  public :
       template<class T> friend int Test(T);
}; 

template int Test(int); // Instantiate the template friend function explicitly.
				

#include "file.h"

// Friend function implementation.
template<class T> int  Test(T temp)
{
	return 0;
}
				
#include "file.h"

//#define CASE1 
//Uncomment the above line to reproduce Case 1. 
//#define CASE2
//Uncomment the above line to reproduce Case 2.

void main()
{

   int x =1;

#ifdef CASE1
   int n = Test('c'); // Gives a C2440 compile error.
#endif

#ifdef CASE2
   Test(x); // Gives LNK2001 linker error.
#endif

} 


				

Propiedades

Id. de artículo: 246891 - Última revisión: miércoles, 05 de febrero de 2014 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft Visual C++ 6.0 Enterprise
Palabras clave: 
kbnosurvey kbarchive kbmt kbbug kbcompiler kblangcpp kbnofix kbtemplate KB246891 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 246891

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com