我在这里做错了什么?或者这是一个 clang++ 错误?
What am I doing wrong here? Or is this a 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;
}
这是我从终端编译的方式:
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 预览版中编译良好。
当我将点调用替换为:
时,它从终端编译正常
std::cout << dot<float, 3>(u, v) << std::endl;
P.S.: 我正在使用的 clang++ 版本:
clang++ --版本
Apple LLVM 版本 6.0 (clang-600.0.57)(基于 LLVM 3.5svn)
将 unsigned int
的所有实例替换为 std::size_t
。 std::array
class 模板声明为。
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);
以下代码无法在我的 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;
}
这是我从终端编译的方式:
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 预览版中编译良好。
当我将点调用替换为:
时,它从终端编译正常std::cout << dot<float, 3>(u, v) << std::endl;
P.S.: 我正在使用的 clang++ 版本: clang++ --版本 Apple LLVM 版本 6.0 (clang-600.0.57)(基于 LLVM 3.5svn)
将 unsigned int
的所有实例替换为 std::size_t
。 std::array
class 模板声明为。
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);