Überladung mit std::shared_ptr und int ungültig



  • Hallo,

    ich habe einen generischen Datencontainer dem man mit einer Methode bind verschiedene Schlüssel-/Wertepaare hinzufügen kann.

    virtual void bind(std::string name, std::shared_ptr<SomeRandomDataClass> value) = 0;
    	virtual void bind(std::string name, int value) = 0;
    

    GCC meint an dieser Stelle, die Überladungen wären uneindeutig. Lässt sich ein Verhalten erzwingen, bei dem jeder numerische Wert als int interpretiert wird und nur explizite shared_ptr-Übergaben als shared_ptr interpretiert werden?

    Vielen Dank



  • Überlad-o-Mat schrieb:

    Hallo,

    virtual void bind(std::string name, std::shared_ptr<SomeRandomDataClass> value) = 0;
    	virtual void bind(std::string name, int value) = 0;
    

    Das Problem liegt wahrscheinlich an einer anderen Stelle. Ich hatte mich schon gewundert weshalb das nicht funktioniert und ein kleines Testprogramm

    #include <iostream>
    #include <memory>
    
    struct A
    {
        virtual void f(std::string name, std::shared_ptr<int> ptr) = 0;
        virtual void f(std::string name, int i) = 0;
    };
    
    struct B : A
    {
        void f(std::string name, std::shared_ptr<int> ptr) override
        {
            std::cout << "ptr" << std::endl;
        }
    
        void f(std::string name, int i) override
        {
            std::cout << "int" << std::endl;
        }
    };
    
    int main()
    {
        B b;
        b.f("", 0);
        b.f("", std::shared_ptr<int>());
    }
    

    ... gibt bei mir unter GCC 4.8.1 wie auch unter MSVC13 wie erwartet

    `int

    ptr`

    aus. Vielleicht postest du mal deine Funktionsaufrufe von bind() . Ein instanz.bind("name", new SomeRandomDataClass()); z.B. kann nicht funktionieren, da der Konstruktor von shared_ptr , der einen Pointer akzeptiert als explicit deklariert ist.

    Gruss,
    Finnegan



  • OMG wie peinlich, der Fehler war ein fehlendes Inklude auf die im Shared-Ptr übergebene Datenklasse. 🙄
    Ich habe mich nur durch die Fehlermeldung verwirren lassen.

    Danke dir, dass du die Zeit investiert hast...


Anmelden zum Antworten