none
enum als templateparameter in vs2013 RRS feed

  • Frage

  • Ich bin gerade dabei, von vs2010 auf 2013 zu migrieren und treffe dabei auf folgendes problem:

    Es gibt eine Exception, die neben dem fehlertext noch ein weiteres feld enthalten soll. dieses feld soll so ein fehlercode sein, der typ des feldes ist ein templateparameter.

    die exception dazu in c#, die sowohl in vs2010 als auch in cs2013 fehlerfrei kompiliert (.net framework 2.0)

    /// <summary>
    /// Generic-Exception, die als Typen ein Enum bekommt, mit dem die erzeugende Componente 
    /// für den Aufrufer auswertbar den Grund der Exception angeben kann.
    /// </summary>
    public class PromessComponentCausedException<enumTypeCause> : PromessComponentException {
    	private enumTypeCause m_enuCauseType;
    
    	/// <summary>
    	/// Erzeugung mit Angabe eines Fehlertextes und eines typisierten Grundes
    	/// </summary>
    	/// <param name="strMessage">Fehlertext</param>
    	/// <param name="enuCause">Grund, warum die Exception geworfen wird</param>
    	public PromessComponentCausedException(string strMessage, enumTypeCause enuCause)
    			: base(strMessage){
    		m_enuCauseType = enuCause;
    	}
    
    	/// <summary>
    	/// Der typisierte Grund für Exception
    	/// </summary>
    	public enumTypeCause CauseType{
    		get{
    			return m_enuCauseType;
    		}
    	}
    }

    Der client ist nur ein managed c++-projekt und funktioniert seit der umstellung auf vs2013 nicht mehr.
    es soll oben dargestellte exception geworfen werden, wobei der template-parater ein enum sein soll. in vs2010 hat das ganze noch fehlerfrei funktioniert, in vs2013 gibt es dagegen folgenden compilerfehler:
    d:\...\Eeprom.h(182): error C3225: generic type argument for 'enumTypeCause' cannot be 'Promess::IO::DriverCommunication::structuresManaged::ErrorType', it must be a value type or a handle to a reference type.

    die entsprechende fehlerzeile:

    namespace structuresManaged{
    	public ref class Eeprom{
    	public:
    		virtual property byte MinSupportedEepromVersion{byte get(){
    			//Hier gibts den compilerfehler
    			throw gcnew PromessComponentCausedException<ErrorType>(
    				"Property MinSupportedEepromVersion wift Exception",
    				ErrorType::Internal);
    		}
    	}
    }

    und das entsprechend ErrorType-enum:

    namespace structuresManaged{
    	enum class ErrorType : int{
    		WrongCardtype, //Die reagierende Hardware ist eine andere als erwartet
    		DriverTooOld, //Benutzter Treiber ist zu alt für Zugriff auf Karte
    		DeviceIoControl //Fehler bei Kommunikation mit Treiber
    	};
    } //namespace structuresManaged

    nimmt man als template-parameter bspw. int funktioniert das ganze wieder, aber ziel ist eben, ein enum als template-parameter zu benutzen.
    frage daher: wie macht mans unter vs2013 und wieso ist das jetzt überhaupt plötzlich ein problem?

    gruß und dank

    micha

    Montag, 20. Oktober 2014 05:16

Antworten

  • falls es interessiert: die lösung des problems ist, das enum mit dem Flagsattribut zu dekorieren:

    namespace structuresManaged{
    	[FlagsAttribute]
    	enum class ErrorType : int{
    		WrongCardtype, //Die reagierende Hardware ist eine andere als erwartet
    		DriverTooOld, //Benutzter Treiber ist zu alt für Zugriff auf Karte
    		DeviceIoControl //Fehler bei Kommunikation mit Treiber
    	};
    } //namespace structuresManaged

    warum das so ist (es sind ja keine flags, die das enum beinhaltet) - keine ahnung

    • Als Antwort markiert suriel6666 Mittwoch, 22. Oktober 2014 05:46
    Mittwoch, 22. Oktober 2014 05:46