У меня такой код:
template <class T>
class lit {
public:
lit(T l) : val(l) {}
T val;
};
template <class T>
class cat {
public:
cat(lit<T> const& a, lit<T> const& b) : a(a), b(b) {}
lit<T> const& a;
lit<T> const& b;
};
template <class T>
cat<T> operator+(lit<T> const& a, lit<T> const& b) {
return cat(a, b);
}
int main() {
auto r1 = cat((lit ('b')), lit('d')); // compiles
auto r2 = (lit ('b')) + lit('d') ; // doesn't compile
auto r3 = lit ('b') + lit('d') ; // compiles
auto r4 = (lit ('b')) ; // compiles
auto r5 = (lit<char>('b')) + lit('d') ; // compiles
}
Это нормально компилируется с clang (как я и ожидал), но gcc выдает следующую ошибку:
prog.cc: In function 'int main()':
prog.cc:23:20: error: missing template arguments after 'lit'
auto r2 = (lit ('b')) + lit('d') ; // doesn't compile
^~~
prog.cc:2:7: note: 'template<class T> class lit' declared here
class lit : public ExpressionBuilder<T> {
^~~
Кажется, что невозможно выяснить вывод шаблона класса из конструктора только в одном очень конкретном случае (r2
). Я предполагаю, что gcc ошибается, но может ли кто-нибудь объяснить, почему он не сработает только в этом очень конкретном случае?
Пример здесь: https://wandbox.org/permlink/jQCOhXFFQekS17Y1
lit ('b') + (lit('d'))
компилируется. - person NathanOliver   schedule 23.10.2018