2016-11-05 3 views
-1
using namespace std; 
using namespace Eigen; 

template<int x> 
class MyClass{ 
    typedef Matrix<float,x,x> MyMatrix; 
    MyClass(); 
    MyMatrix getMatrix(); 
}; 

template<int x> 
MyClass<x>::MyClass(){ 
    int y = x+1; 
    MyMatrix m; 
    MyClass::MyMatrix mx; 
} 

template<int x> 
MyClass<int x>::MyMatrix getMatrix(){ 
    MyMatrix m; 
    return m; 
} 

Ich habe den folgenden Code. Unfortuantely kann die letzte decalration nicht kompilieren (getMatrix) und ich erhalte eine Fehlermeldung, dass ich eine Typname vor myClass :: myMatrix brauche, weil MyClass ein abhängiger Umfang istKann nicht vorlagenbasiert C++ Code kompilieren: Benötigter Typname vor Klasse

Changed es an:

template<int x> 
typename MyClass<x>::MyMatrix MyClass<x>::getMatrix(){ 
    MyClass<x>::MyMatrix mx; 
    return mx; 
} 

Es ist immer noch nicht kompilieren und den gleichen Fehler geben. Auch sie öffentlich gemacht

+0

Was ist wirklich unklar über die Fehlermeldung? Schreiben Sie einfach 'typename MyClass :: MyMatrix getMatrix() {'. –

+0

Warum werde ich downvoted? Dies ist eine berechtigte Frage – powerdog

+1

Sie vermissen es, eine [MCVE] einschließlich wörtlicher Fehlermeldungen zu liefern, auch fehlt es offensichtlich an Forschungsanstrengungen. –

Antwort

0

Es gibt viele Fehler in Ihrem Code. Lassen Sie uns fixieren sie eins nach dem anderen:

template<int x> 
MyClass<x>::MyClass(){ 
    int y = x + 1; 
    MyMatrix m; 
    MyClass::MyMatrix mx; 
} 

Hier ist es wirklich schwer zu sogar verstehen, was Sie versuchen, hier zu tun. Warum gibt es y? Und warum versuchen Sie, die gleiche Klasse anders zu verwenden? Hier ist, wie es aussehen, wenn festgelegt:

template<int x> 
MyClass<x>::MyClass(){ 
    MyMatrix m; 
    MyMatrix mx; 
} 

Beide MyMatrix bezieht sich auf das gleiche, das Sie in MyClass erklärt.


Jetzt ist dieses Stück Code:

template<int x> 
MyClass<int x>::MyMatrix getMatrix(){ 
    MyMatrix m; 
    return m; 
} 

Die Syntax ist hier falsch. Die Lösung, wie man dieses Problem beheben ist einfach nur um oben auf den Code suchen, und sagen, das, was der Compiler erzählt Sie tun:

template<int x> 
//    v----- Here! 
typename MyClass<x>::MyMatrix getMatrix(){ 
//     ^--- Dependent name here. Matrix is a type that depends 
//      on the parameter `x`. You must put typename to 
//      tell the compiler that it's a type 
    MyMatrix m; 
    return m; 
} 

Warum Sie den Typ einer Variablen angeben würde, wenn Sie es verwenden?

Ich sehe keine anderen Probleme.

Verwandte Themen