Visual Studio 2015 Community EditionでMSVCの最新バージョンを使用しています。テンプレートの特殊化と演算子のオーバーロードに関する問題があります。特殊なテンプレートを使用した場合のオペレータエラーの未定義
私は次の(ヘッダーのみ)ベクトルクラススニペットを持っています。不要なコードを除外しました(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オペレータが意図したとおりに動作しているとは思いますが、i ndexing演算子はそうではありません。私がやっていることは明らかに間違っているのですか、あるいは現在のMSVCは単に私がしようとしていることをサポートしていませんか?
特殊化は、基本テンプレートのメンバーにアクセスできません。継承元の共通基本クラスを作成することができます。 – DeiDei