我有以下代码:
这段代码在clang下编译没有问题(正如我所期望的),但是在gcc下会出现以下错误:
似乎无法从构造函数中推断出类模板的类型,但只有在一个非常特定的情况下(
示例在这里:https://wandbox.org/permlink/jQCOhXFFQekS17Y1
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'))
竟然可以编译通过。 - NathanOliver