无法进行基于模板的C ++代码编译:Class之前需要的typename

时间:2016-11-05 05:21:55

标签: c++ templates

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;
}

我有以下代码。不幸的是,最后的decalration无法编译(getMatrix),我得到一个错误,说我在MyCLass :: MyMatrix之前需要一个typename,因为MyClass是一个依赖范围

将其更改为:

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

它仍然没有编译并给出相同的错误。也公开了

1 个答案:

答案 0 :(得分:0)

您的代码中存在许多错误。让我们一个一个地解决它们:

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

这里很难理解你在这里想要做什么。为什么有y?为什么你试图以不同的方式使用同一个类?这是修复后的样子:

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

两个MyMatrix都指同一个,即您在MyClass中声明的那个。

现在,这段代码:

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

这里的语法错误。解决方法如何解决这个问题只需要查看上面的代码,并告诉编译器告诉你做什么:

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;
}

为什么要在使用变量时指定变量的类型?

我没有看到其他问题。