C++ 模板函数定义
我有以下代码:C++ 模板函数定义,c++,templates,c++11,g++,clang++,C++,Templates,C++11,G++,Clang++,我有以下代码: template<typename T1, typename T2> auto operator*(const T1& a, const T2& b) -> decltype(viennacl::linalg::prod(a, b)) { return viennacl::linalg::prod(a, b); } template<typename T1, typename T2> auto operator*(const
template<typename T1, typename T2>
auto operator*(const T1& a, const T2& b) -> decltype(viennacl::linalg::prod(a, b)) {
return viennacl::linalg::prod(a, b);
}
template<typename T1, typename T2>
auto operator*(const T1& a, const T2& b) -> decltype(prod(a, b)) {
return prod(a, b);
}
那么,哪个编译器是错误的呢
可能的解决办法是什么?(如果不清楚我想做什么:我想实现operator*
,以便它使用viennacl::linalg::prod
或prod
,具体取决于哪一个提供了实现。)
小型独立测试用例:
namespace X {
template<typename T> struct Mat{};
template<typename T> struct MatExpr {};
template<typename T>
MatExpr<T> prod(Mat<T> const& A, Mat<T> const& B) { return MatExpr<T>(); }
};
struct Mat2 {};
template<typename T>
X::Mat<T> prod(X::Mat<T> const& A, Mat2 const& B) { return X::Mat<T>(); }
template<typename T1, typename T2>
auto operator*(const T1& a, const T2& b) -> decltype(X::prod(a, b)) {
return X::prod(a, b);
}
template<typename T1, typename T2>
auto operator*(const T1& a, const T2& b) -> decltype(prod(a, b)) {
return prod(a, b);
}
int main() {}
名称空间X{
模板结构Mat{};
模板结构MatExpr{};
模板
MatExpr prod(Mat const&A,Mat const&B){return MatExpr();}
};
结构Mat2{};
模板
X::Mat prod(X::Mat const&A,Mat2 const&B){return X::Mat();}
模板
自动运算符*(常数T1和a,常数T2和b)->decltype(X::prod(a,b)){
返回X::prod(a,b);
}
模板
自动运算符*(常数T1和a,常数T2和b)->decltype(产品(a,b)){
返回产品(a、b);
}
int main(){}
我在GCC中将上游作为一个bug进行了报告。我相信稍后会有人来引用标准中关于GCC是对还是错的相关段落。同时,您可以尝试以下解决方法:
template<typename T1, typename T2>
auto operator *(const T1 &a,
const T2 &b) -> decltype(::prod<typename T1::value_type>(a, b))
这是一个。对于相同的T1和T2,这两种类型给出的确切类型是什么?如果它们是一样的,我希望它能像你一样发出信息。
prod
和viennacl::linalg::prod
永远不会两者都起作用,总是第一个或第二个;甚至在这两种情况下都没有定义decltype。此外,错误不会在使用时发生,当编译器解析定义时,错误已经发生。构造SSCCE时有任何更改吗?
template<typename T1, typename T2>
auto operator *(const T1 &a,
const T2 &b) -> decltype(::prod<typename T1::value_type>(a, b))
namespace X
{
template<typename T> struct Mat { typedef T value_type; };
// ...