繁体   English   中英

使用专用模板时出现未定义的操作员错误

[英]Undefined operator error when using specialised template

我正在将最新版本的MSVC与Visual Studio 2015社区版一起使用,并且模板专业化和运算符重载遇到一些问题。

我有以下(仅标头)向量类代码段。 我排除了不必要的代码(即vec2和vec4的相同专长)。

template <typename T, int n>
struct VectorN
{
    T data[n];

    T& operator[](const int i);
};

template <typename T, int n>
T& VectorN<T, n>::operator[](const int i)
{
    static_assert(i >= 0 && i < n, "Index out of range");
    return data[i];
}

template <typename T, int n>
std::ostream& operator<<(std::ostream& os, const VectorN<T, n>& vec)
{
    for (auto i = 0; i < n; ++i)
    {
        os << vec[i];
    }
    return os;
}

具有以下专长:

template <typename T>
struct VectorN<T, 3>
{
    union
    {
        T data[3];

        struct
        {
            T x, y, z;
        };
    };
};

typedef VectorN<int, 3> Vec3i;
typedef VectorN<float, 3> Vec3f;

我正在编译的主要功能是:

int main(int argc, char *argv[])
{
    Vec3f vec{ 0, 1, 2 };

    std::cout << vec << std::endl;

    char dump;
    std::cin >> dump;
    std::cin.clear();

    return 0;
}   

我希望它能起作用,但是,我得到一个Error: C2676 binary '[': 'const VectorN<float,3>' does not define this operator or a conversion to a type acceptable to the predefined operator

我相信ostream运算符正在按预期工作,但索引运算符却没有。 我正在做的任何事情显然是错误的,还是当前的MSVC根本不支持我正在尝试做的事情?

operator<<之所以起作用,是因为您对VectorN模板类型有适当的重载。

另一方面, operator[] 不起作用 ,因为在VectorN的专用版本中没有operator[] (编译器请告诉您)。

您可以将operator[]添加到VectorN类的专用版本,也可以如@DeiDei所述,尝试将某些功能移至基类。

如果要保留基于union的解决方案以同时访问dataxyz的3维向量,则可以使用CTRP创建一个基类,该基类知道派生类的data成员:

namespace impl
{
    template <typename T, int n, typename TDerived>
    struct VectorBase
    {
        const T& operator[](const int i) const
        {   
            assert(i >= 0 && i < n);
            return static_cast<const TDerived&>(*this).data[i];
        }
    };
}

然后可以按以下方式实现派生类:

template <typename T, int n>
struct VectorN : impl::VectorBase<T, n, VectorN<T, n>>
{
    T data[n];
};

template <typename T>
struct VectorN<T, 3> : impl::VectorBase<T, 3, VectorN<T, 3>>
{
    union
    {
        T data[3];

        struct
        {
            T x, y, z;
        };
    };

    VectorN(T ax, T ay, T az) : data{ax, ay, az} {}
};

在wandbox上有一个工作示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM