2013-06-13 4 views
1

У меня есть следующие std::begin оберток вокруг матриц Eigen3:Как получить дополнительную информацию об ошибках замены замещения клана?

namespace std { 
template<class T, int nd> auto begin(Eigen::Matrix<T,nd,1>& v) 
-> decltype(v.data()) { return v.data(); } 
} 

Замена терпит неудачу, и я получаю ошибку компиляции (ошибки: нет подходящей функции для вызова «начать»). Для этой перегрузки выходы clang следующие:

.../file:line:char note: candidate template ignored: 
substitution failure [with T = double, nd = 4] 
template<class T, int nd> auto begin(Eigen::Matrix<T,nd,1>& v) 
          ^

Я хочу, чтобы эта перегрузка была выбрана. Я ожидаю, что типы будут double и int, т. Е. Они выводятся так, как я хочу, чтобы они были выведены (и, надеюсь, правильно). Посмотрев на функцию, я не вижу ничего, что может действительно потерпеть неудачу.

Время от времени я получаю подобные ошибки. Здесь clang говорит мне: сбой замены, я не помещаю эту функцию в набор разрешений перегрузки. Однако это не помогает мне отлаживать вообще. Почему не удалось заменить? Что именно не могло быть заменено где? Единственное, что для меня очевидно, что компилятор знает, но сознательно не говорит мне :(

  • Можно ли силы лязг сказать мне что же именно здесь неудачу?

  • Эта функция тривиальна и у меня возникают проблемы. В более сложных функциях, я думаю, все может только ухудшиться. Как вы идти об отладке такого рода ошибки?

ответ

2

Вы можете отлаживать ошибки замещения, выполняя подстановку самостоятельно в пазу в исходном шаблоне и видя, какие ошибки компилятор выводит для полностью специализированного кода. В этом случае:

namespace std { 
auto begin(Eigen::Matrix<double,4,1>& v) 
-> decltype(v.data()) { 
    typedef double T; // Not necessary in this example, 
    const int nd = 4; // but define the parameters in general. 
    return v.data(); 
} 
} 
1

Ну это было сообщено как bug в звоне. К сожалению, разработчики clang все еще не знают, как лучше всего это исправить. До тех пор вы можете использовать gcc, который будет сообщать об обратной стороне, или вы можете применить этот код patch для clang 3.4. Патч - это быстрый хак, который превратит ошибки замены в ошибки.

Смежные вопросы