Is this good c++ code for a pin/socket for a node editor?
Input and output count
enum InputOutputCount {
    NOTHING = 0, //Is this redundant?
    ONE = 1,
    MULTIPLE = -1
};

Yes, I think a pin that does not allow anything to connect to it is redundant. This could be replaced with a simple bool that indicates whether multiple connections are allowed or not.
Note that it doesn't make sense to restrict the number of connections to an output pin, there is nothing ambiguous about that. However, for input pins there is ambiguity: what should you do if there are multiple, different values on the input? Do you pick one, sum them, average them, multiply them? So there it does make sense to restrict the input to just one connection.
Make Pin::Value a reference
Does it make sense for Value to be a null pointer? After setting the pointer, can the pointer change? If the answer to both of these questions is no, then it is better to make it a reference, like so:
template &lt;class T&gt;
struct Pin: PinAbstract {
    ...
    T &amp;value;
    ...
};

You should add a constructor that initializes the reference, so that it is not possible to construct a concrete Pin without a correct reference. You can also use this to ensure the title is always set to something useful, like so:
template &lt;class T&gt;
struct Pin: PinAbstract {
    const std::string Title;
    T &amp;value;
    std::vector&lt;Pin&gt; Connections;

    Pin(T &amp;value, const std::string &amp;title): Value(value), Title(title) {}
};

Return an error if a connection cannot be made
Your function ConnectPins() silently ignores errors when trying to connect two incompatible pins together. Consider adding some way of reporting an error. It can be as simple as returning a bool indicating success, or you could throw an exception. This could then be used by the UI to display an error message.
Pass pins by reference to ConnectPins()
Similar to why you might want to use a reference instead of a pointer for Pin::Value, since you should never pass a NULL pointer to ConnectPins(), it is better to pass them by reference:
template &lt;class T&gt;
bool ConnectPins(Pin&lt;T&gt; &amp;pin1, Pin&lt;T&gt; &amp;pin2) {
    if (pin1.Type != pin2.Type)
        return false;
    ...

    pin1.Connections.push_back(&amp;pin2);
    pin2.Connections.push_back(&amp;pin1);
    return true;
}