首页 > 解决方案 > 相同的代码在 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++visual-studiolibraries

解决方案


C++17 标准引入了类模板参数推导 (CTAD),这意味着:

Static3Vector v(0, 0, 0);

将在 C++17 上编译,推导出T=int. 在 C++14 上,它会发出错误,因为您必须在模板上提供类型。在 Compiler Explorer 上并排查看此示例:https ://godbolt.org/z/MHPkhh

因此,您的情况的解决方案是指定模板参数,强制两个构建系统使用 C++17,或者使用统一初始化。

但是,如果您对两种情况都使用相同的编译器版本并且它们没有产生相同的结果,那么其中一种可能不符合标准。


推荐阅读