Один и тот же код не работает в двух разных проектах. для использования шаблона класса требуется список аргументов шаблона - PullRequest
0 голосов
/ 08 мая 2020

В настоящее время я пишу математическую библиотеку basi c, внутри моего решения у меня есть 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

В чем может быть причина этого? Как обеспечить постоянную работу библиотеки?

1 Ответ

1 голос
/ 08 мая 2020
• 1000 В C ++ 14 он выдаст ошибку, так как вы должны указать тип в шаблоне. См. Этот пример бок о бок в Compiler Explorer: https://godbolt.org/z/MHPkhh

Итак, решение для вашего случая - либо указать аргумент шаблона, либо заставить обе системы сборки использовать C ++ 17 или используйте единую инициализацию.

Но если вы используете одну и ту же версию компилятора для обоих случаев и они не дают одинаковый результат, один из них может не соответствовать Стандарту.

...