【问题标题】:C++ template partial specialization errorC++ 模板部分特化错误
【发布时间】:2011-01-05 10:51:32
【问题描述】:

以下代码给我一个编译错误:class Q64 is not a valid type for a template constant parameter

template<int GRIDD, class T>
INLINE T grid_residue(T amount) {
  T rem = amount%(GRIDD);
  if (rem > GRIDD/2) rem -= GRIDD;
  return rem;
}


template<int GRIDD, Q64>
INLINE Q64 grid_residue(Q64 amount) {
  return Q64(grid_residue<GRIDD, int64_t>(to_int(amount)));
}

怎么了?我正在尝试将grid_residue 专门用于Q64 类。

更新:

改变了语法。现在收到错误error: function template partial specialization 'grid_residue&lt;GRIDD, Q64&gt;' is not allowed

template<int GRIDD>
INLINE Q64 grid_residue(Q64 amount) {
    return Q64(grid_residue<GRIDD, int>(to_int(amount)));
}

谢谢

【问题讨论】:

    标签: c++ templates g++ template-specialization partial-specialization


    【解决方案1】:

    函数不能部分特化!要么使用函数重载:template &lt;int GRIDD&gt; inline Q64 grid_residue(Q64 amount),要么将你的函数包装在一个类型中(可以部分特化)。

    【讨论】:

    • 函数重载...不是那种专业化吗?但是,修改后的代码仍然出现错误(我会发布)。
    【解决方案2】:

    您不能部分专门化函数。

    【讨论】:

    • 就是这样。如果您提供一个如何使用两个简单类的示例,那将是 +1...
    【解决方案3】:
    struct test
    {
    
    };
    
    template<int GRIDD, class T>
    T grid_residue(T amount) 
    {
        std::cout << "template<int GRIDD, class T> T grid_residue(T amount)" << " GRIDD: " << GRIDD << std::endl;
        return T();
    }
    
    
    template<int GRIDD>
    test grid_residue(test amount) 
    {
        std::cout << "template<int GRIDD> test grid_residue(test amount)" << " GRIDD: " << GRIDD << std::endl;
        int inp = 0;
        grid_residue<GRIDD,int>(inp);
        return test();
    }
    
    
    int 
    _tmain(int argc, _TCHAR* argv[])
    {
        test amount;
        grid_residue<19>(amount);
        std::string inValue;
        grid_residue<19>(inValue);
    }
    

    编译/链接正常(VS2010)。

    【讨论】:

      猜你喜欢
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      相关资源
      最近更新 更多