我哪里做错了?或者这是clang++的bug



下面的代码无法在我的Mac上编译

#include <iostream>
#include <array>
template <typename T, unsigned int N>
using Vector = std::array<T, N>;
template <typename T, unsigned int N>
T dot(const Vector<T, N> &l, const Vector<T, N> &r) {
    T result{0};
    for (auto i = 0; i < N; ++i) {
        result += l[i] * r[i];
    }
    return result;
}
using Vector3f = Vector<float, 3>;
int main(int argc, const char * argv[]) {
    Vector3f u{1.0f, 2.0f, 3.0f};
    Vector3f v{6.0f, 5.0f, 4.0f};
    std::cout << dot(u, v) << std::endl;
    return 0;
}

下面是我如何从Terminal编译的:

clang++ -std=c++11 -stdlib=libc++ repro.cpp -o repro

下面是我得到的错误:

repro.cpp:24:18: error: no matching function for call to 'dot'
    std::cout << dot(u, v) << std::endl;
                 ^~~
repro.cpp:10:3: note: candidate template ignored: substitution failure [with T = float]: deduced non-type template
      argument does not have the same type as the its corresponding template parameter
      ('unsigned long' vs 'unsigned int')
T dot(const Vector<T, N> &l, const Vector<T, N> &r) {
  ^
1 error generated.

代码在Visual Studio 2015 Preview中可以很好地编译。

当我用

替换点调用时,它从终端编译得很好
std::cout << dot<float, 3>(u, v) << std::endl;

注:我正在使用的clang++版本:铿锵声+ +,版本Apple LLVM version 6.0 (clang-600.0.57)(基于LLVM 3.5svn)

unsigned int的所有实例替换为std::size_tstd::array类模板声明为。

template< class T, std::size_t N > struct array;

在模板实参推导过程中,如果非类型模板形参与相应的实参不匹配,则推导失败。在您的系统上,std::size_t恰好别名为long unsigned int,将代码更改为以下代码应该可以工作:

template <typename T, std::size_t N> // <--
using Vector = std::array<T, N>;
template <typename T, std::size_t N> // <--
T dot(const Vector<T, N> &l, const Vector<T, N> &r);

最新更新