【发布时间】:2016-10-20 08:15:56
【问题描述】:
我在 Visual Studio 2015 社区版中使用最新版本的 MSVC,但在模板专业化和运算符重载方面遇到了一些问题。
我有以下(仅标题)矢量类 sn-p。我已经排除了不必要的代码(即 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 根本不支持我正在尝试做的事情?
【问题讨论】:
-
专业化无权访问其基本模板的成员。你可以创建一个通用的基类来继承。
标签: c++ c++11 visual-c++ c++14