2016-07-04 79 views
0

我現在正在學習如何使用boost::geometry庫,並且我正在學習教程,其中引入了類型特徵以使代碼更通用。爲什麼traits :: access無法編譯(C++)?

struct mypoint 
{ 
    double x, y; 
}; 

template <typename P1, typename P2> 
double distance(P1 const& a, P2 const& b) 
{ 
    double dx = get<0>(a) - get<0>(b); 
    double dy = get<1>(a) - get<1>(b); 
    return std::sqrt(dx * dx + dy * dy); 
} 

template <typename P1, typename P2> 
double distance(P1 const& a, P2 const& b) 
{ 
    double dx = get<0>(a) - get<0>(b); 
    double dy = get<1>(a) - get<1>(b); 
    return std::sqrt(dx * dx + dy * dy); 
} 

namespace traits 
{ 
    template <> 
    struct access<mypoint, 0> 
    { 
     static double get(mypoint const& p) 
     { 
      return p.x; 
     } 
    }; 

    template <> 
    struct access<mypoint, 1> 
    { 
     static double get(mypoint const& p) 
     { 
      return p.y; 
     } 
    }; 

} 

然而,當我編譯代碼,以下編譯錯誤發生:

Error 3 error C2913: explicit specialization; 'traits::access' is not a specialization of a class template 

任何想法。例如,下面的distance功能是通過特徵視爲遺傳?謝謝。

+1

術語是「通用」,而不是「遺傳」 :) –

回答

2

你有專門的traits::access沒有給出一個通用的定義,所以加:

namespace traits 
{ 
    template <typename, int> 
     struct access; 
    /* ... */ 
}