头文件中模板类实现的模板成员

Template member of template class implementation in header file

本文关键字:成员 实现 文件      更新时间:2023-10-16

我有一个看起来像这样的类

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

我哪里做错了?

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

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

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

 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) {
      |                                                   ^

这是尽可能接近教科书exaMPLE

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

但它失败了。