간단한 벡터 클래스를 작성하고 특정 길이의 벡터에서만 사용할 수있는 일부 멤버 함수를 갖고 싶습니다. 예를 들어 3 요소 벡터). 나는 std :: enable_if를 우연히 발견했고, 내가 원하는 것을 할 수있는 것처럼 보이지만 제대로 작동하지 못하는 것 같다.C++ 11 std :: enable_if를 사용하여 vector가 특정 길이 인 경우 멤버 함수 사용 가능
vec.cpp: In instantiation of ‘class Vector<double, 4u>’:
vec.cpp:46:22: required from here
vec.cpp:29:59: error: no type named ‘type’ in ‘struct std::enable_if<false, double>’
지적 할 수있는 사람이 내가 잘못 가고 있습니다 :
#include <iostream>
#include <type_traits>
template<typename T, unsigned int L>
class Vector
{
private:
T data[L];
public:
Vector<T,L>(void)
{
for(unsigned int i = 0; i < L; i++)
{
data[i] = 0;
}
}
T operator()(const unsigned int i) const
{
return data[i];
}
T& operator()(const unsigned int i)
{
return data[i];
}
Vector<typename std::enable_if<L==3, T>::type, L> cross(const Vector<T,L>& vec2) const
{
Vector<T,L> result;
result(0) = (*this)(1) * vec2(2) - (*this)(2) * vec2(1);
result(1) = (*this)(2) * vec2(0) - (*this)(0) * vec2(2);
result(2) = (*this)(0) * vec2(1) - (*this)(1) * vec2(0);
return result;
}
};
int main(void)
{
Vector<double,3> v1;
Vector<double,3> v2;
Vector<double,3> v3;
//Vector<double,4> v4;
v1(0) = 1;
v1(1) = 2;
v1(2) = 3;
v2(0) = 4;
v2(1) = 5;
v2(2) = 6;
v3 = v1.cross(v2);
std::cout << v3(0) << std::endl;
std::cout << v3(1) << std::endl;
std::cout << v3(2) << std::endl;
return 0;
}
컴파일 위의 코드와 내가 컴파일에서 다음과 같은 오류가 Vector<double,4> v4
의 선언의 주석을 단 경우, 제대로 실행?
가능한 중복 (HTTP (이 여전히 C++ 표준의-위에서 언급 한 두 단락에서 다음) .com/questions/4880922/can-i-use-on-a-member-function) –
당신은 아마도'typename std :: enable_if> :: type'을 쓰고 싶지 않을 것입니다. 'Vector :: type, L>'. –
(당신은 아마도 const'operator()'가'T const &'를 돌려 주길 원할 것입니다. 현재 코드는 클라이언트가'Vector v; 벡터 const & const_v = v; const_v (2) = 42.0; 42의 쓰기는 일시적으로 발생합니다. 사용자가 예상 한대로가 아닙니다.) –