gpt4 book ai didi

c++ - 表达式模板 - 无法专门化函数模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:59 24 4
gpt4 key购买 nike

我试图制作一些表达式模板作为对 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 错误,但我想不出正确的方法。谁能帮我找出导致这些错误的原因?

最佳答案

我从 GCC 得到的一些错误提示我,其中涉及一个模棱两可的基础。即 expression_multiply<expression_parameter, expression_parameter>expression_parameter作为(直接)基地,和inherit_again<expression_parameter>它本身有 expression_parameter作为基地。这意味着 lhs::operator()expression_multiply<expression_parameter, expression_parameter> 的范围内不明确(其中 lhs 实际上是 expression_parameter

需要进一步修复 thisoperator() 的返回类型中需要,导致以下修复:

// Instead of inherit_again
template<int N, class sub_expr>
class base : public sub_expr {
public:
base(sub_expr rhs): sub_expr(std::move(rhs)) {}
};

template<class lhs_given, class rhs_given>
class expression_multiply: private base<0, lhs_given>, private base<1, rhs_given> {
typedef base<0, lhs_given> lhs;
typedef base<1, rhs_given> rhs;
public:
expression_multiply(lhs_given l, rhs_given r):lhs(std::move(l)), rhs(std::move(r)) {}
template<class T>
auto operator()(const T& v) const
-> decltype(this->lhs::operator()(v) * this->rhs::operator()(v))
{
return lhs::operator()(v) * rhs::operator()(v);
}
};

不知道编译器是否在纠正这两个“修复”的需要。

关于c++ - 表达式模板 - 无法专门化函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11043715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com