2011-02-01 12 views
2
、私は以下のaddValues呼び出ししようとしている

C++メソッドのシグネチャ問題

Obj *s = new Obj(); 
vector<tm> dates(SIZE); 
vector<double> values[COUNT]; 
for (uint i = 0; i < COUNT; i++) { 
    values[i] = vector<double>(SIZE); 
} 
s->addValues(&dates, &values); // <- this is the error line 

をし、私が定義したaddValues:

void addValues(vector<tm> *newDates, vector<double> (*newValues)[COUNT]); 

正確なエラーがある:

no matching function for call to ‘Stock::addValues(std::vector<tm, std::allocator<tm> >*, std::vector<double, std::allocator<double> > (*)[5])’ 

I私のメソッドのシグネチャが一致しないという考えがあると思う。 addValuesの正しい署名とは何ですか?

+0

再現性がありません:http://ideone.com/FEX9w – kennytm

+0

'std :: vector'以外では、他にどのベクトルを使用していますか? –

+1

ObjとStockの定義は何ですか? 'Obj'は' Stock'から直接継承されますか? –

答えて

1
template <size_t N> 
void addValues(vector<tm>* newDates, vector<double> (&newValues)[N]); 

この理由は、そのテンプレートのためです。値を配列として定義するので、値Nはコンパイル時に認識されます。vector<double> values[COUNT]。コンパイラはコンパイル時に値のサイズを知っているので、NCOUNTに置き換えることができます。

テンプレートであるため、必ずこのサイズの配列を使用してこの関数を呼び出すことができます。サイズは必ずしもCOUNTでなくてもかまいません。

Fred Nurkが提案したように、newDatesを参照に変更することもお勧めします。

template <size_t N> 
void addValues(vector<tm>& newDates, vector<double> (&newValues)[N]); 
+2

このコードが機能する理由を詳しく説明するために、このコードは、配列内の要素数に応じて関数をパラメータ化します。これにより、サイズ情報を保持しながら任意のサイズの配列を受け入れることができます。そうすれば、あなたは2つのことを得る。まず、ベクトルの配列をポインタではなく値で渡します。これはもう少し正常です。次に、サイズの合意についてもう一度心配する必要はありません。コンパイラは、どれだけのスペースが使用されているかを記録します。 – templatetypedef

+0

@templatetypedef:配列ポインタの代わりに配列参照を渡したい場合は、これを使わずに行うことができます。配列参照の場合と同様に、配列ポインタの大きさがチェックされます。 –

+0

@Fred Nurk- True;私はそうではないことを示唆することを意味しませんでした。私がここで「合意」を意味するのは、あるサイズを受け入れるだけのコードを書く必要がなく、その特定のサイズをどこでも使うことを心配することでした。 – templatetypedef

1

これは、私はそれをコンパイルするためにあなたのコードを書き直した方法です:

#include <ctime> 
#include <vector> 

using namespace std; 

typedef unsigned int uint; 

#define SIZE 3 
#define COUNT 3 

struct Obj { 
    void addValues(vector<tm> *newDates, vector<double> (*newValues)[COUNT]) 
    {} 
}; 

int main() { 
    Obj *s = new Obj(); 
    vector<tm> dates(SIZE); 
    vector<double> values[COUNT]; 
    for (uint i = 0; i < COUNT; i++) { 
     values[i] = vector<double>(SIZE); 
    } 
    s->addValues(&dates, &values); 
} 

、それは正しくコンパイル。

ご覧のとおり、コードはあなたとほぼ同じです。メンバー関数の宣言で使用されているCOUNT値が、valuesを作成したものと同じであるかどうかを確認してください。

関連する問題