2017-07-17 1 views
6

Ich versuche, meinen Kopf herum zu wickeln, warum ein Problem gibt es versucht, dieseTemplated Klasse Parameter Überlastung

#include <iostream> 
template <unsigned int ROWS,unsigned int COLS> 
class Matrix{ 
    public: 
     double dotProd(const Matrix<1,COLS>& other){ 
      static_assert(ROWS==1,"dotProd only valid for two vectors"); 
      return COLS;//place holder for dot product with row vectors 
     } 
     double dotProd(const Matrix<ROWS,1>& other){ 
      static_assert(COLS==1,"dotProd only valid for two vectors"); 
      return ROWS;//place holder for dot product with col vectors 
     } 
}; 
int main(){ 
    Matrix<1,32> bob; 
    Matrix<1,32> fred; 
    std::cout<<bob.dotProd(fred)<<std::endl; 
    return 0; 
} 

zu kompilieren, die mir diesen Fehler geben:

overloadedTemplateMethod2.cpp: In instantiation of ‘class Matrix<1u, 1u>’: 
overloadedTemplateMethod2.cpp:17:32: required from here 
overloadedTemplateMethod2.cpp:9:16: error: ‘double Matrix<ROWS,COLS>::dotProd(const Matrix<ROWS, 1u>&) [with unsigned int ROWS = 1u; unsigned int COLS = 1u]’ cannot be overloaded 
    double dotProd(const Matrix<ROWS,1>& other){ 
      ^
overloadedTemplateMethod2.cpp:5:16: error: with ‘double Matrix<ROWS, COLS>::dotProd(const Matrix<1u, COLS>&) [with unsigned int ROWS = 1u; unsigned int COLS = 1u]’ 
    double dotProd(const Matrix<1,COLS>& other){ 
      ^

Ich verstehe, dass die Vorlage Ausfüllen der Parameter würde dazu führen, dass die zweite Funktion auf double dotProd(const Matrix<1,1>& other) auflösen, aber ich würde denken, dass der andere zu double dotProd(const Matrix<1,32>& other), nicht Matrix<1,1> wieder auflösen sollte.

was geht hier vor?

Antwort

4

Wenn Sie dies tun:

bob.dotProd(fred) 

Die dotProd Funktionen instanziiert werden, um den Ruf nach Matrix<1,32> zu lösen.
können wir, dass (Disclaimer: Es ist nicht genau, wie es funktioniert, aber es gibt die Idee von dem, was unter der Haube passiert) sagen, dass sie am Ende als erklärt werden:

double dotProd(const Matrix<1,32>& other); 
double dotProd(const Matrix<1,1>& other); 

die erste und lassen Sie uns auf das konzentrieren, ignorieren der zweite. Es erfordert eine neue Spezialisierung von Matrix, also: Matrix<1,1>.
Wenn Sie eine solche Spezialisierung betrachten, welche Deklarationen würden Sie für dotProd erhalten, wenn Sie Vorlagenparameter durch tatsächliche Werte ersetzen?

double dotProd(const Matrix<1,1>& other); // Matrix<1, COLS> 
double dotProd(const Matrix<1,1>& other); // Matrix<ROWS, 1> 

Das heißt, Sie am Ende eine überladene Funktion erklärt, die nicht in der Liste der Parameter unterscheidet. Also der Fehler.

Sie erhalten genau die gleichen Fehler, wenn Sie den Körper Ihrer main Funktion mit der folgenden Zeile ersetzen:

Matrix<1,1> someone; 

Mit anderen Worten: Ihre Klassenvorlage Matrix ist schlecht ausgebildet, in den Fällen, wo COLS und ROWS sind gleich.

+0

Also, was Sie sagen, ist, wenn die Argumente der zweiten Funktion zu Matrix <1,1> aufgelöst werden, muss diese Klasse generiert werden, und da es schlecht mit diesen Argumenten gebildet wird, verursacht das Problem? –

+0

@Austin_anderson Yep. Ich würde sagen, dass mehr oder weniger was passiert. Die Fehlermeldung erwähnt einen Typ "Matrix <1,1>" zusammen mit dem Fehler tatsächlich. – skypjack

+0

cool Ich habe nur versucht, die Fehlermeldung zu entmystifizieren und das macht es wirklich schön, ich denke, mein nächster Schritt wäre, diese Funktionsvorlagen zu machen und static_assert die Parameter sind gleich dem entsprechenden Klassenparameter –

Verwandte Themen