Konstruktorproblem mit Template.



  • Hallo,

    was muss ich tun, damit dieser Code korrekt funktioniert?

    template<class Argument> class A
    {
    public:
    	class B
    	{
    	public:
    		B()
    		{
    		}
    
    		B(const B&)
    		{
    		}
    
    		template<class OtherArgument> B(const typename A<OtherArgument>::B&)
    		{
    		}
    	};
    };
    
    int main(void)
    {
    	A<int>::B b1;
    	A<int>::B b2=b1;
    	A<bool>::B b3=b2;
    }
    

  • Mod

    A<OtherArgument>::B ist kein für OtherArgument deduzierbarer Konstrukt. Dieser Konstruktor kann niemals aufgerufen werden. Ein Konvertierungoperator wäre sicherlich eine Möglichkeit aber wohl keine gute Lösung. Dann verbleibt nur, das Argument allgemeiner zu fassen und im Nachhinein (ggf. in Kombination mit SFINAE) OtherArgument aus dem deduzierten Templateargument zu bestimmen (der Compiler kann OtherArgument nicht selbst bestimmen, aber wir können es berechen, da wir die innere Struktur von B kennen).

    template<class Argument> class A
    {
    public:
        class B
        {
        public:
            typedef Argument A_Argument;
    ...
            template<class T> B(const T&, typename enable_if< is_same< T, typename A< typename T::A_Argument >::B >::type* = 0)
            {
            }
        };
    };
    


  • Jop, das ist es. Danke.


Anmelden zum Antworten