具有从属名称的部分特化(typename)

时间:2013-09-16 08:30:34

标签: c++ template-specialization partial-specialization typename

我有以下简单的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);
        }
    };
}

2 个答案:

答案 0 :(得分:6)

这只是问题的另一种形式,已经多次讨论过:没有从X类型到类型T的一对一映射,MyMatrix<T>::Vector3 == X

简单示例:

MyMatrix<double> { typedef Vector3 int; };
MyMatrix<float> { typedef Vector3 int; };

stringToTypeImpl<int> // Help, what is "T"?

答案 1 :(得分:0)

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中不匹配。