c++ - 相同的代码在 2 个不同的项目中失败。使用类模板需要模板参数列表
问题描述
我目前正在编写一个基本的数学库,在我的解决方案中我有 2 个项目,它们之间的唯一区别是一个是使用 premake 构建的,另一个是刚刚添加到我的解决方案中的。两者都有相同的代码
#include <iostream>
#include "MathLib.h"
int main()
{
MathLib::Matrix3x3<float> m;
std::cout << m[0][0];
return 0;
}
Matrix3x3 类如下所示:
template <class T>
class Matrix3x3
{
public:
Matrix3x3() : m_rows{} {}
Matrix3x3(Static3Vector<T> v1, Static3Vector<T> v2, Static3Vector<T> v3) : m_rows{ v1, v2, v3 } {}
Matrix3x3(T scalar) : m_rows{ Static3Vector(scalar, 0, 0), Static3Vector(0, scalar, 0), Static3Vector(0, 0, scalar) } {} //creates a scaled identity matrix
~Matrix3x3() = default;
private:
Static3Vector<T> m_rows[3];
和 Static3Vector 类
template <class T , typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
class Static3Vector
{
public:
Static3Vector() : m_coords{ (T)0, (T)0, (T)0 } {}
Static3Vector(T x, T y, T z) : m_coords{ x, y, z } {}
Static3Vector(const Static3Vector& v) : m_coords{v[0], v[1], v[2]} {}
~Static3Vector() = default;
private:
T m_coords[3];
第一个项目编译得很好并输出 0。第二个项目抛出
Error C2955 'MathLib::Static3Vector': use of class template requires template argument list
这可能是什么原因?如何确保图书馆每次都能正常工作?
解决方案
C++17 标准引入了类模板参数推导 (CTAD),这意味着:
Static3Vector v(0, 0, 0);
将在 C++17 上编译,推导出T=int
. 在 C++14 上,它会发出错误,因为您必须在模板上提供类型。在 Compiler Explorer 上并排查看此示例:https ://godbolt.org/z/MHPkhh
因此,您的情况的解决方案是指定模板参数,强制两个构建系统使用 C++17,或者使用统一初始化。
但是,如果您对两种情况都使用相同的编译器版本并且它们没有产生相同的结果,那么其中一种可能不符合标准。
推荐阅读
- typescript - 有没有办法在打字稿的类型级别上将两个数字相加?
- python - 导入 Pandas 和 Numpy?
- c# - DialogService 在 ShowDialog 中将 Object 作为参数传递
- r - 尝试将一个数字添加到绘图中的 x 轴刻度
- c++ - 概念上由一个唯一对象拥有的共享指针
- linux - 如何在另一个内核模块上使用导出的符号?
- c++ - How to forward declare inherited class in generator function with different files?
- r - 在 MacOS/CRAN 上构建 R 包时包含 boost tokenizer.hpp 文件时出错
- python - Extract date from a string with a lot of numbers
- c# - Serilog 能否捕获方法参数