Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 叠瓦C++;模板_C++_Templates - Fatal编程技术网

C++ 叠瓦C++;模板

C++ 叠瓦C++;模板,c++,templates,C++,Templates,我有以下模式: template <int a, int b> class MyClass { public: template <int c> MyClass<a, c> operator*(MyClass<b, c> const &other) const; }; // ../.. template <int a, int b> template <int c> MyClass<a, c>

我有以下模式:

template <int a, int b>
class MyClass
{
public:
  template <int c>
  MyClass<a, c> operator*(MyClass<b, c> const &other) const;
};

// ../..

template <int a, int b> template <int c>
MyClass<a, c> MyClass<a, b>::operator*(MyClass<b, c> const &other) const //< error here
{
  MyClass<a, c> result;
  // ..do stuff..
  return result;
}
模板
类MyClass
{
公众:
模板
MyClass运算符*(MyClass常量和其他)常量;
};
// ../..
模板
MyClass MyClass::运算符*(MyClass常量和其他)常量//<此处出错
{
我的班级成绩;
//…做事。。
返回结果;
}
它没有编译,错误消息是

错误C2975。错误C2975:“dom”:MyClass的参数模板无效

如果我用
template
替换
template
并相应地使用它,它就可以正常工作。但是我希望
d
b
的值相同

我的问题是:

  • 为什么这个例子不起作用
  • 如何使
    d
    b
    相同

  • 谢谢。

    以下代码对我来说很好(应该是这样的)

    模板
    结构MyClass
    {
    模板
    MyClass运算符*(MyClass常量和其他)常量;
    };
    模板
    MyClass MyClass::运算符*(MyClass常量和其他)常量
    {
    我的班级成绩;
    返回结果;
    }
    int main()
    {
    我的a级;
    MyClass b;
    a*b;
    }
    
    请注意,在代码中:

  • 您正在返回对临时文件的引用
  • 操作符*
    不能从类外部访问,因为它是私有的

  • 请张贴真实代码并指出错误所在的行。

    几乎+1表示“叠瓦”。这是C++模板中常用的短语吗?你能显示实例化模板的代码吗?听起来您可能试图使用变量作为参数(例如,
    int number=stuff();MyClass thing;
    ),而数值模板参数必须是编译时常量。@Thilo:我真的不知道,它错了吗@迈克:我完全同意,但问题是我还没有把它说出来。嗯。。。一个在其声明中包含2个整数的模板和一个乘法函数,该函数返回一个实例,该实例从LHS获取第一个模板参数,从RHS获取第二个模板参数,我将假设这是一个矩阵类:幸运的是,可见性和可访问性之间存在着完全不同。符号根据可见性进行解析(即它们是否存在于此范围或任何父范围内,以及覆盖规则等),然后检查可访问性…我进行了一些编辑,以使代码更准确。谢谢你给我推荐信的提示。您的示例已编译,但我的示例仍然没有编译,除非我在类(!)中定义了方法体。顺便问一下,使用
    struct
    关键字而不是
    class
    的原因是什么?
    struct
    的默认访问模式是
    public
    ,因此在示例中可以节省空间;)除了
    /..do stuff..
    部分之外,此代码现在与您的代码相同。也许错误就在那里?(使用
    struct
    将成员公开,但除此之外,与
    class
    完全相同)。
    template <int a, int b>
    struct MyClass
    {
        template <int c>
        MyClass<a, c> operator*(MyClass<c, b> const &other) const;
    };
    
    template <int a, int b> template <int c>
    MyClass<a, c> MyClass<a, b>::operator*(MyClass<c, b> const &other) const
    {
        MyClass<a, c> result;
        return result;
    }
    
    int main()
    {
        MyClass<1, 2> a;
        MyClass<3, 2> b;
        a * b;
    }