具有依赖名称(类型名称)的部分专用化

partial specialization with dependent name (typename)

本文关键字:专用 类型 依赖      更新时间:2023-10-16

我有以下简单的strinToTypeImpl函数,可以将任何类型的字符串转换为模板类型。我担心的问题是编译器告诉我typename MyMatrix<T>::Vector3的部分特化:

模板参数 T 未用于部分专用化

我不能在专用化中使用从属名称吗?

namespace details
{
    template<typename T>
    struct stringToTypeImpl{
        bool operator()(T& t, const std::string& s)
        {
          std::istringstream iss(s);
          return !(iss >> t).fail();
        }
    };

    template<typename T>
    struct stringToTypeImpl< typename MyMatrix<T>::Vector3  >{ 
        // Replacing typename MyMatrix<T>::Vector3  by 
        // Eigen::Matrix<T,3,1> WORKS but why?
        bool operator()(typename MyMatrix<PREC>::Vector3 & t, const std::string& s)
        {
          stringToVector3<PREC>(t,s);
        }
    };
}
这只是已经

讨论过多次的问题的另一种形式:从类型X到类型T没有一对一的映射,以至于MyMatrix<T>::Vector3 == X

简单的例子:

MyMatrix<double> { typedef Vector3 int; };
MyMatrix<float> { typedef Vector3 int; };
stringToTypeImpl<int> // Help, what is "T"?

Kerreck 的回答和我在那里的评论解释了这个问题。类型系统无法将成员映射到成员的父级,因此::运算符停止需要匹配T的推导过程。

解决方案的简单方法是将Vector3引入外部并将其专用于矩阵类型,然后将成员MyMatrix< T >::Vector3 typedef

template< typename Matrix >
struct Vector3 {
    typename Matrix::ValueType x, y, z;
};
template< typename T >
struct MyMatrix {
    typedef Vector3< MyMatrix > Vector3;
};

StringToTypeImpl的部分专用化需要针对最终模板类型,而不是 typedef。部分专用化不能跨一组 typedef 匹配,尽管专用化可以将类型与由单个 typedef 名称别名的类型匹配。