2012-07-16 19 views
5

現在、すべての型のSTL配列をパラメータの1つとして取る関数を記述しようとしています。テンプレート引数の型から関数のテンプレートパラメータを控除する

template<typename T, int count> 
void setArrayBufferData(GLenum usage, const std::array<T, count>& data) { 
    setArrayBufferData(usage, data.data(), sizeof(T) * count); 
} 

そして、ここではそれだけで参照

void setArrayBufferData(GLenum usage, void* data, int size) { 
    glBufferData(GL_ARRAY_BUFFER, size, data, usage); 
} 

関数定義は罰金コンパイルを求めて他の過負荷です:それを書くために明白な方法があります。私は

std::array<int, 4> data; 
setArrayBufferData(GL_STATIC_DRAW, data); 

それを呼び出すようにしようとすると、しかし、私はエラーメッセージ「『setArrayBufferData』への呼び出しに該当する機能」を取得していません。私はそれが動作する呼び出しでテンプレートパラメータを指定したのかどうかは知っていますが、呼び出すために呼び出す必要があります。私は、テンプレートテンプレートのパラメータ、より一般的な宣言の後にstd :: arrayの特殊化、および私が考えることができる他のすべての構文上のバリエーションを研究しようとしましたが、私が探しているものを得る方法を見つけることができないようですために。それは可能なのか、もしそうなら、何をする必要がありますか?

答えて

7
template<typename T, int count> 
void setArrayBufferData(GLenum usage, const std::array<T, count>& data) 

は、std :: arrayがtemplate<typename T, size_t N> struct arrayであるため、間違っています。 2番目のパラメータは、ではなく、size_tの型でなければなりません。

また、データは::配列をはstdするconst参照であるため、data.dataは()constはT *を返すので、setArrayBufferData(GLenum usage, const void* data, int size)にしようとか、setArrayBufferData(usage, const_cast<T*>(data.data()), sizeof(T) * count);

#include <array> 

void function(const void* ptr, size_t bytes) 
{ 
} 

template<typename T, size_t count> 
void function(const std::array<T, count>& array) 
{ 
    function(array.data(), sizeof(T) * count); 
} 

int main() 
{ 
    std::array<int, 4> array; 
    function(array); 
} 

この例では、正常に動作してそれを呼び出します。 http://liveworkspace.org/code/2a5af492e1f4229afdd0224171854d1c

+1

intをsize_tに変更することは決して考えられませんでした。一度それをすると、void *のconstenceがより明らかになります。ありがとう。それは今働く。 –

関連する問題