Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ alias模板的Visual Studio 2013编译器崩溃_C++_Templates_Visual Studio 2013 - Fatal编程技术网

C++ alias模板的Visual Studio 2013编译器崩溃

C++ alias模板的Visual Studio 2013编译器崩溃,c++,templates,visual-studio-2013,C++,Templates,Visual Studio 2013,最近我编写了一些代码编译,结果导致窗口崩溃,并显示消息“编译器驱动程序已停止工作”。下面是仍然复制此崩溃的最小代码 namespace _private_ { // Using SFINAE to figure out the return type of T::operator[]. // If T does not have operator[], then class T itself is used, // so that return type of T::o

最近我编写了一些代码编译,结果导致窗口崩溃,并显示消息“编译器驱动程序已停止工作”。下面是仍然复制此崩溃的最小代码

namespace _private_
{
    // Using SFINAE to figure out the return type of T::operator[]. 
    // If T does not have operator[], then class T itself is used,
    // so that return type of T::operator[] is calculated as
    // type = esists(T::operator[]) ? typeof(T[0]) : T;
    struct SquareBracesReturnType
    {
    private:
        template<class T>
        static decltype(std::declval<T>()[0])    test(T* t);

        template<class T>
        static T test(...);

    public:
        template<class T>
        using type = decltype(test<T>(0));
    };
}


template<class TArray>
using SquareBracesReturnType = _private_::SquareBracesReturnType::type < TArray > ;

template<class TArray, class TSubArray = SquareBracesReturnType<TArray>>
struct ArrayTypeTraits
{
    using SubArrayTypeRaw = TSubArray;
    using SubArrayType = typename std::remove_reference<SubArrayTypeRaw>::type;
    using SubarrayTypeTraits = ArrayTypeTraits < SubArrayType, typename SquareBracesReturnType<SubArrayType> > ;
    using ArrayType = TArray;
    static const size_t nDim = 1 + SubarrayTypeTraits::nDim;
    using ElementType = typename SubarrayTypeTraits::ElementType;
private:
    template<class T, class TArg>
    static TArg dummyFunc(SubArrayTypeRaw(T::*)(TArg));
public:
    using IndexType = decltype(dummyFunc(&TArray::operator[]));
};

template<class T>
struct ArrayTypeTraits < T, T >
{
    using ArrayType = T;
    static const size_t nDim = 0u;
    using ElementType = T;
};

template <class TArray>
using IndexTypeOf = typename ArrayTypeTraits<TArray>::IndexType;

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
     ArrayTypeTraits<vector<double >>::IndexType j = 3u; // line 1
     IndexTypeOf<vector<double >> i = 3u;                // line 2
     double d = 0.0;                                     // line 3
     //d = i; // <-----uncomment this to break compiler  // line 4

     return 0;
}
namespace\u private_
{
//使用SFINAE计算T::operator[]的返回类型。
//如果T没有运算符[],则使用类T本身,
//因此,T::运算符[]的返回类型计算为
//type=esists(T::operator[])?typeof(T[0]):T;
结构SquareBracesReturnType
{
私人:
样板
静态decltype(std::declval()[0])测试(T*T);
样板
静态T检验(…);
公众:
样板
使用类型=decltype(测试(0));
};
}
样板
使用SquareBracesReturnType=\u private\:SquareBracesReturnType::type;
样板
结构ArrayTypeTraits
{
使用SubrayTypeRaw=TSubArray;
使用subraytype=typename std::remove_reference::type;
使用SubrayTypeTraits=ArrayTypeTraits;
使用ArrayType=TArray;
静态常量大小nDim=1+子数组类型特征::nDim;
使用ElementType=typename子数组TypeTraits::ElementType;
私人:
样板
静态TArg dummyFunc(子阵列类型(T::*)(TArg));
公众:
使用IndexType=decltype(dummyFunc(&TArray::operator[]);
};
样板
结构ArrayTypeTraits
{
使用ArrayType=T;
静态常数大小nDim=0u;
使用ElementType=T;
};
样板
使用IndexTypeOf=typename ArrayTypeTraits::IndexType;
使用名称空间std;
int _tmain(int argc,_TCHAR*argv[]
{
ArrayTypeTraits::IndexType j=3u;//第1行
IndexTypeOf i=3u;//第2行
双d=0.0;//第3行

//d=i;//我认为您丢失了一些include文件或其他东西,因为g++会抛出几十个关于丢失这个、那个或另一个的错误。如果您让编译器崩溃,那就是编译器中的一个错误。毫无疑问。我在VS2013中也遇到了同样的问题。肯定是编译器错误。您应该在Connect上报告它。是的,编译器即使在恩,你给他们喂“垃圾”,更不用说正确的代码了(肘部测试曾经是一种流行的软件稳定性测试——也就是说,如果需要的话,将肘部放在键盘上多次)。