2011-10-09 5 views
2

저는 연산자를 스칼라 또는 벡터 및 이들을 혼합하여 적용하는 데 사용되는 클래스가 있습니다. 클래스는 작동하지만 템플릿 매개 변수를 수동으로 전달해야합니다. 그것들은 생성자로부터 공제되어야한다.정책을 사용한 템플릿 매개 변수 공제

template <template <class,class> class OP, typename Type1, typename Type2> 
class BinaryOperator : 
    public OP <typename Type1::ReturnType, typename Type2::ReturnType> { 
public: 

    BinaryOperator(Type1* arg1_, Type2* arg2_) : 
     m_arg1(arg1_), 
     m_arg2(arg2_) { 

    } 

    ReturnType evaluate() { 
     return this->apply(m_arg1->evaluate(), m_arg2->evaluate()); 
    } 

private: 
    Type1* m_arg1; 
    Type2* m_arg2; 
}; 

는 이제, 영업 이익은 2 개 ctor에 매개 변수의 ReturnTypes이다 스칼라/벡터의 다양한 조합에 대한 전체 템플릿 특성화와 구조 : 코드는 다음과 같다. 난 그냥

new BinaryOperator<op_adder>(a1, c2) 

를 작성 좋아하고 축 및 상수 차감이있을 것이다 동안 내가 명시 적으로

new BinaryOperator<op_adder, Axis, Constant>(a1, c2) 

작성해야합니다. 컴파일러 오류 :

too few template arguments for class template 'BinaryOperator' 

어떤 사람이 도움이 될 수 있습니까? 내가 뭘 잘못하고 있니? 감사합니다. alex

답변

5

클래스 유형에는 템플릿 인수를 사용할 수 없습니다. 어쨌든 컴파일러는 어떤 클래스를 생성 할지를 알기 전에 고려해야 할 생성자를 어떻게 알 수 있습니까?

해결 방법은 도우미 함수 ala std::make_pair을 작성하는 것입니다.

template<typename T, typename U, typename V> 
BinaryOperator<T, U, V> make_binary_operator(const U& u, const V& v) { 
    return BinaryOperator<T, U, V>(u, v); 
}