返回模板化结果

Returning templated result

本文关键字:结果 返回      更新时间:2023-10-16

我有以下代码:

#include <array>
#include <iostream>
#include <typeinfo>
#include <type_traits>
#include <utility>
namespace impl
{
    template <typename T>
    struct Matrix_traits {
    };
}
template <size_t M, size_t N, typename T>
class Matrix
{
};
template <size_t M, size_t N, typename T>
struct impl::Matrix_traits<Matrix<M, N, T>> {
    template <typename U>
    struct scalar_mult_type
    {
        // just for testing
        using type = std::pair<std::array<T, M>, std::array<T, N>>;
    };
};
int main()
{
    Matrix<3, 4, char> m;
    mult(3, m);
    return 0;
}

当我使用以下函数实现时,明确指定返回类型:

template <typename T, typename U>
std::pair<std::array<char, 3>, std::array<char, 4>> mult(const T& lambda, const U& m)
{
    typename impl::Matrix_traits<U>::scalar_mult_type<T>::type result;
    std::cout << typeid(result).name() << "tEUREKA!n";
    return result;
}

它有效。。。但这显然不是我想要的。。。但当我试图变得更灵活时:

template <typename T, typename U>
typename impl::Matrix_traits<U>::scalar_mult_type<T>::type mult(const T& lambda, const U& m)
{
    typename impl::Matrix_traits<U>::scalar_mult_type<T>::type result;
    std::cout << typeid(result).name() << "tEUREKA!n";
    return result;
}

我有"无法识别的模板声明/定义"错误。这对我来说真的很困惑。为什么同样的声明适用于局部变量"result",但作为返回类型却失败了?

template缺失,应为

template <typename T, typename U>
typename impl::Matrix_traits<U>::template scalar_mult_type<T>::type
mult(const T& , const U& )
{
    typename impl::Matrix_traits<U>::template scalar_mult_type<T>::type result;
    std::cout << typeid(result).name() << "tEUREKA!n";
    return result;
}

演示

相关文章: