Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板函数定义_C++_Templates_C++11_G++_Clang++ - Fatal编程技术网

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; };
  // ...