2017-01-14 1 views
0

Ich habe ein Problem mit dem Überladen einer Funktion, die eine Vorlage als Eingabe erhält. Ich habe eine Vorlage Vektor:Funktion Überladung mit einer Vorlage Klasse

template TempVec<class T, int size> 

, die zwei Optionen: Vektor von int nach Größe 3 oder einen Vektor von komplexen nach Größe 2.

Ich habe eine Funktion InnerProduct genannt, die zwei Vektoren und kehrt bekommt das Ergebnis der inneren Produkte zwischen den Vektoren. Das Problem ist, dass der Typ des Rückgabewerts vom Typ des Vektors abhängt (int/complex).

Also habe ich diese drei Funktionen (in der Klasse von TempVec):

template <class T, int size> 
    friend int InnerProduct(const TempVec<T, 3>& v1, const TempVec<T, 3>& v2); 

template <class T, int size> 
    friend complex InnerProduct(const TempVec<T, 2>& v1, const TempVec<T, 2>& v2); 

template <class T, int size> 
    friend TempVec<T, size> InnerProduct(const TempVec<T, size>& v1, const TempVec<T, size>& v2); 

Als ich InnerProduct nennen, ich auf die letzte Funktion bekommen immer (die allgemeinste Funktion), auch wenn ich zwei Vektoren passieren der Größe 3 oder zwei Vektoren der Größe 2. habe ich versucht, die letzte Funktion, um loszuwerden, aber ich habe den Fehler:

'InnerProduct': none of the 2 overloads could convert all the argument types. 

würde ich nach einer Erklärung/Lösung des Problems sehr dankbar.

Antwort

1

Die ersten 2 Überlastungen kann nie jemals genommen werden (ohne explizit zu werden), da der Compiler nicht size ableiten kann, und so SFINAE tritt in und die Überlastungen werden verworfen.

Der Compiler kann size nicht ableiten, weil Sie es nie in der Funktionssignatur angeben. size ist völlig redundant in den 2 Überladungen möglicherweise (ich kenne den Körper nicht), aber der Compiler muss es initialisieren. Da es aus der Signatur nicht abgeleitet werden kann, müssen Sie es selbst angeben. Wenn Sie das nicht tun, werden sie niemals ausgewählt.

Wenn Sie die dritte entfernen, erhalten Sie natürlich einen Compilerfehler, da die ersten beiden Überladungen nicht ausgewählt werden können, wenn Sie selbst keine size angeben.

Entfernen Sie einfach size, brauchen Sie es nicht:

template <class T> 
    friend int InnerProduct(const TempVec<T, 3>& v1, const TempVec<T, 3>& v2); 

template <class T> 
    friend complex InnerProduct(const TempVec<T, 2>& v1, const TempVec<T, 2>& v2); 
Verwandte Themen