2016-03-22 19 views
3

Zur Zeit habe ich die folgende KlasseWie explizit Schablonen Konstruktor in C++ instanziieren?

//AABB.h 
class AABB { 
    public: 
    template <class T> 
    AABB(const std::vector<T>& verties); 
    template <class T> 
    AABB(const std::vector<int>& indicies, const std::vector<T>& verties); 
    template <class T> 
    AABB(const std::vector<int>::const_iterator begin, 
     const std::vector<int>::const_iterator end, 
     const std::vector<T>& verties); 
    AABB(); 
    AABB(const vec3 min, const vec3 max); 
    AABB(const AABB& other); 

    const vec3& min_p() const { return m_min; } 
    const vec3& max_p() const { return m_max; } 

    vec3 center(); 
    float volume(); 
    float surface_area(); 
    bool inside(vec3 point); 
    float intersect(const Ray& ray); 

    private: 
    vec3 m_min; 
    vec3 m_max; 
}; 

Es gibt drei AABB Konstruktoren, die als Templat. Gibt es eine Möglichkeit, explizite Instanziierung zu deklarieren? Wie folgt?

// AABB.cpp 
template AABB::AABB<Triangle>(const idx_t, const idx_t, const vector<Triangle>&); 

gegeben

// AABB.cpp 
using idx_t = std::vector<int>::const_iterator; 

Zur Zeit der Fehler von dem Compiler ist

/Users/DarwinSenior/Desktop/cs419/tracer2/src/AABB.cpp:7:16: error: qualified 
     reference to 'AABB' is a constructor name rather than a type wherever a 
     constructor can be declared 
template AABB::AABB<Triangle>(const idx_t, const idx_t, 
      ^
+1

Befreien Sie sich von der '' und Sie sollten in Ordnung sein. –

Antwort

1

Sie fast da sind, dann ist das Problem das letzte Argument eine Referenz sein muss, wie es in der Template-Deklaration ist:

template AABB::AABB<Triangle>(const idx_t, const idx_t, const vector<Triangle>&); 
//                   ^^^ 

Auch als TC darauf hingewiesen, können Sie <Triangle> entfernen, weil es geschlossen werden kann von der Art des Arguments:

template AABB::AABB(const idx_t, const idx_t, const vector<Triangle>&); 
+0

Danke für den Fang. Allerdings habe ich die Antwort bearbeitet und das Problem bleibt bestehen. Ich habe den Fehler hinzugefügt, den ich bekommen habe. Welchen Compiler benutzen Sie? – darwinsenior

+0

@darwinsenior Ich verwende GCC und jetzt sehe ich, dass Clang diese Nachricht produziert. Es kann mit der zweiten Option behoben werden (ohne ''), obwohl ich nicht sicher bin, ob es ein Compiler Bug ist oder nicht. –

+0

Danke. Ich werde das Dreieck los und es hat funktioniert. Ich denke, es könnte als ein Fehler betrachtet werden. – darwinsenior

0

Sie können nicht explizit den Typ für eine Vorlage Konstruktor definieren.
Stattdessen werden sie aus den Argumenten definiert.

Als Beispiel betrachten wir den folgenden Code:

struct S { 
    template<typename T> 
    S(T t) { } 
}; 

// ... 

S s{'c'} 

Hier können Sie eigentlich nicht erforderlich, den Typ zu bestimmen und aus dem Argument als char definiert ist.

Verwandte Themen