2016-01-14 142 views
1

可以說我有兩個類。第一個是簡單的模板類Point<N, T>,另一個是Function<Point<N, T>>。是否可以在類Function中訪問以鍵入T和int N模板模板參數訪問

這裏是我的Point我認爲這是確定

template<int N, class T> 
class Point { 
public: 
    Point() { 
     std::fill(std::begin(data), std::end(data), T(0)); 
    } 

    Point(const std::initializer_list<T> &init) { 
     std::copy(init.begin(), init.end(), std::begin(data)); 
    } 

public: // just for easier testing, otherwise protected/private 
    T data[N]; 
}; 

現在Function實現,我認爲有一些問題

template<template<int, typename> class P, int N, typename T> 
class Function { 
public: 
    T operator()(const P<N, T> &pt) { 
     for (int i = 0; i < N; i++) { 
      // do something and expect loop unrolling 
     } 
     return T(0); // for example's sake 
    } 

    T operator()(const P<N, T> &pt1, const P<N, T> &pt2) { 
     // force pt1 and pt2 to have the same `N` and `T` 
     return T(0); // for example's sake 
    } 
}; 

這裏就是我想象我會用我的班。也許我在想太多java-like :)

typedef Point<3, float> Point3f; 
typedef Point<4, float> Point4f; 

Point3f pt3f({ 1.0, 2.0, 3.0 });  // Point<3, float> 
Point4f pt4f({ 1.0, 2.0, 3.0, 4.0 }); // Point<4, float> 

Function<Point3f> f3;   // Function<Point<3, float>> f3; 

float val = f3(pt3f);   // no error 
float val = f3(pt3f, pt3f); // no error 
float val = f3(pt4f);   // compile error 
float val = f3(pt4f, pt3f); // compile error 

我該如何實現這樣的行爲?我不斷收到這樣的錯誤"Point<3, float>" is not a class templatetoo few arguments for class template "Function"

回答

2
template<class Point> 
class Function; 

template<template<int, typename> class P, int N, typename T> 
class Function<P<N,T>> 

更換:

template<template<int, typename> class P, int N, typename T> 
class Function 

解決您的語法問題。

+0

謝謝你的幫助。現在工作。我擔心這是不可能的。 – mitjap