【发布时间】:2012-06-15 01:54:44
【问题描述】:
我试图制作一些表达式模板作为this question 的答案,但我遇到了编译器错误,我无法弄清楚。我现在的 SSCCE 已经很小了
template<class sub_expr>
class inherit2 : private sub_expr { //line 3
public:
inherit2(sub_expr rhs) : sub_expr(rhs) {}
template<class T>
auto operator()(const T& v) const ->decltype(sub_expr::operator()(v)) //line 7
{return sub_expr::operator()(v);}
};
class expression_parameter {
public:
template<class T>
const T& operator()(const T& v) const {return v;}
};
int main() {
expression_parameter x;
auto expr0 = x;
int res0 = expr0(3); //line 20
auto expr1 = inherit2<expression_parameter>(x); //line 21
int res1 = expr1(3); //line 22
return 0;
}
当我用 MSVC10++ 编译时,我得到这个错误:
f:\code\utilities\exprtemplate\exprtemplate\sscce.cpp(22): error C2893: Failed to specialize function template ''unknown-type' inherit2<sub_expr>::operator ()(const T &) const'
with
[
sub_expr=expression_parameter
]
With the following template arguments:
'int'
当我使用 GCC 4.6.3 编译时:
sscce.cpp: In instantiation of 'inherit2<expression_parameter>':
sscce.cpp:21:47: instantiated from here
sscce.cpp:3:7: warning: base class 'class expression_parameter' has a non-virtual destructor [-Weffc++]
sscce.cpp: In function 'int main()':
sscce.cpp:22:20: error: no match for call to '(inherit2<expression_parameter>) (int)'
sscce.cpp:3:7: note: candidate is:
sscce.cpp:7:10: note: template<class T> decltype (sub_expr:: operator()(v)) inherit2::operator()(const T&) const [with T = T, sub_expr = expression_parameter, decltype (sub_expr:: operator()(v)) = decltype (expression_parameter::operator()(v))]
sscce.cpp:20:6: warning: unused variable 'res0' [-Wunused-variable]
sscce.cpp:22:6: warning: unused variable 'res1' [-Wunused-variable]
最后是 Clang 3.1
sscce.cpp(22,12) : error: no matching function for call to object of type 'inherit2<expression_parameter>'
int res1 = expr1(3);
^~~~~
sscce.cpp(7,9) : note: candidate template ignored: substitution failure [with T = int]
auto operator()(const T& v) const ->decltype(sub_expr::operator()(v))
^
总而言之:它似乎我弄错了decltype,但我想不出正确的方法。谁能帮我找出导致这些错误的原因?
【问题讨论】:
-
大胆猜测:你试过
decltype( lhs()( v ) * rhs()( v ) )吗? -
先生。鸭子,你知道得更清楚..."Please tag questions about C++11 with the C++ tag, along with the C++11 tag." ;-]
-
@ildjarn:我没有意识到这一点,尽管事后看来它是完全有道理的。谢谢。
-
@dirkgently:好主意,但似乎没有效果。当我尝试
lhs(v)时,编译器认为这是一个构造。 -
@dirkgently:一旦我加入了 Luc 对模糊基本问题的修复,那么你的评论就解决了我的问题。愿意将其发布为答案吗?
标签: c++ templates c++11 expression-trees