【问题标题】:Template member of template class implementation in header file头文件中模板类实现的模板成员
【发布时间】:2019-03-28 11:14:58
【问题描述】:

我有一个看起来像这样的课程

template<class T>
class Matrix {
    ...
    template<class T2> auto dot(Matrix<T2> const& other);
}

这是我的实现,在头文件中的声明下:

template<class T, class T2>
auto Matrix<T>::dot(Matrix<T2> const& other) {
    [impl]
}

我得到的错误如下所示:

(C2244) 'Matrix<T>::dot' : unable to match function definition to an existing declaration

我哪里错了?

【问题讨论】:

  • 你不能把两个模板声明混在一起,伙计:)

标签: c++ class templates header-files generic-programming


【解决方案1】:

语法错误。在带有模板参数 T 的类模板中,您有一个带有模板参数 T2 的函数模板。它必须像这样定义:

template<class T>
template<class T2> 
auto Matrix<T>::dot(Matrix<T2> const& other) {

}

【讨论】:

    【解决方案2】:

    这不是一个答案,而是这个(类似)问题的重复——首先定义/声明了类,编译器可以接受:

     template<typename UnsignedInt,
            std::enable_if_t<std::is_unsigned<UnsignedInt>::value, int> = 0>
    class binangle {
        ...
        template<typename F>
        void set_from_degrees(F rad);
        ...
    

    然而,当它实现实现时

    template<typename F>
    void binangle<UnsignedInt>::set_from_radians(F rad) {
        static_assert(std::is_unsigned<UnsignedInt>::value);
        static_assert(std::is_floating_point<F>::value);
        ...
    

    它抛出错误:

    /home/sipan/src/vgit/signals/tests/../include/binangles_impl.hpp:23:51: error: invalid use of incomplete type ‘class signals::binangle<UnsignedInt>’
       23 | void binangle<UnsignedInt>::set_from_radians(F rad) {
          |                                                   ^
    

    这是尽可能接近教科书示例

    //template member definition
    template<typename T>
    template<typename T2>
    void A<T>::f(T2)
    {
        // some code
    }
    

    但它失败了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      相关资源
      最近更新 更多