Почему этот код вызывает сбой компилятора VC ++? - PullRequest
10 голосов
/ 03 декабря 2010

Я использую следующий компилятор:

Microsoft Visual C ++ 2010

Следующий код вызывает сбой компилятора при его компиляции:

template<class T_> 
void crasher(T_ a, decltype(*a)* dummy = 0){}

int main()
{
    crasher(0);
    return 0;
}

decltype(*a)* используется для принудительного указания T_ типа указателя - такого как char*, int* и shared_ptr<int>.

Почему происходит сбой?Это известная ошибка?

Ответы [ 3 ]

2 голосов
/ 19 января 2012

Предполагая, что ваша цель

decltype(*a)* используется для обеспечения T_ типа указателя - например, char*, int * и shared_ptr.

... вам нужен простой шаблон, а не код, который может привести к сбою компилятора:)

Вот кое-что, что может работать для вас

#include <memory>
#include <iostream>

// uncomment this "catch all" function to make select(0) compile
// int select(...){ return 0;}
template<class T>  int select(T*){ return 1;}
template<class T>  int select(std::auto_ptr<T>){ return 1;}
// add boost::shared_ptr etc, as necessary

int main()
{
    std::cout << select(0) << std::endl;
    std::cout << select(std::auto_ptr<int>()) << std::endl;
    std::cout << select(&std::cout) << std::endl;
    return 0;
}
0 голосов
/ 19 ноября 2011

Я просто не понимаю, почему вы пишете decltype (* a) * вместо decltype (a). Так как 0 (ноль) является int по умолчанию, то выражение decltype (a) также будет int. Если вы хотите, чтобы var dummy был указателем на decltype (a), вы должны написать decltype (a) *. Таким образом, dummy будет иметь тип int *. Вы также должны рассмотреть преобразования типов. 0 может конвертировать в int *. Не уверен, что это работает для всех типов.

0 голосов
/ 04 октября 2011

Шаблон недействителен для мгновенного действия T_=int, поскольку префикс operator* является ошибкой замещения, поэтому он должен каким-то образом завершиться с ошибкой, хотя, конечно, без сбоев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...