Visual Studio 2013中的函数模板替换错误?

时间:2014-10-12 21:35:29

标签: c++ templates visual-studio-2013

让我们有一个具有operator []的类TArrayTarray[index]的返回类型已知,我们称之为TResult,但index本身的类型TIndex,我想知道。为此,我已经确定了 以下模板。

template<class TArray, class TResult>
struct ArrayIndexType
{
    template<class TIndex>
    using OperatorFunc = TResult(TArray::*)(TIndex);

    template<class TIndex> 
    static TIndex test(OperatorFunc<TIndex>);

    using type = decltype(test(&TArray::operator[]));
};

它实际上适用于std :: vector:

cout << typeid(ArrayIndexType<vector<double>, /*TResult=*/double&>::type).name();
// output:    unsigned int.

但是当我为最简单的继承做同样的事情时:

class DoubleVec: public vector<double>
{};
cout << typeid(ArrayIndexType<DoubleVec, /*TResult=*/double&>::type).name();

我得到编译错误C2664:&#39; TIndex ArrayIndexType :: test(TResult(__ thistall DoubleVec :: *)(TIndex))&#39; :无法从&#39;重载函数&#39;转换参数1 to&#39; double&amp;(__ thiscall DoubleVec :: *)(unsigned int)&#39;

这基本上意味着编译器无法在向量:double& vector::operator[](size_t)const double& vector::operator[](size_t)中定义的operator []的2个重载之间进行选择。 这是MSVS 2013中的错误还是我做错了什么?

也许有更好的方法来实现目标,即获得operator []的参数类型? 谢谢你的回答。

1 个答案:

答案 0 :(得分:1)

这不是一个错误。 &DoubleVec::operator[]的类型仍然是&#34;指向std::vector<double>&#34;的成员函数的指针,并且编译器无法推导出指向{{的成员函数的&#34;指针1}}&#34;从它。

对于标准容器来说,这几乎都是毫无意义的:

DoubleVec

或者,类类型上的模板template<class T> using ArrayIndexType = typename T::size_type; 也是:

OperatorFunc