2

テンプレート関数を記述しようとすると、次のエラーが発生し続けます。

main.cpp|17|error: no matching function for call to ‘dotproduct(vector<float, 3u>&, vector<float, 3u>&)’|

エラーを検索したところ、パラメーターが float または double の場合に型以外のテンプレート パラメーターが問題になる可能性がある他のケースがいくつか見つかりました。size_t行列とベクトルのサイズを決定するために、タイプのないテンプレート パラメータを使用しています。

私は次のクラスを持っています:

マトリックス:

template<class element_t, size_t rows, size_t columns>
class matrix
{
private:
  element_t elements_[rows*columns];
  // ...
};

ベクター:

template<class element_t, size_t size>
class vector
  : public matrix<element_t, size, 1>
{
  //...
};

私の機能:

template<class vector_t>
typename vector_t::element_t dotproduct(const vector_t &vector0, const vector_t &vector1)
{
  typename vector_t::element_t result_(0);
  for(size_t index_ = 0; index_ < vector_t::rows * vector_t::colums; ++index_){
    result_ += vector0[index_] * vector1[index_];
  }

  return result_;
}

から呼び出されます:

int main(int count, char *arguments[])
{
  typedef vector<float, 3> vec3;

  vec3 a = {1.0f, 2.0f, 3.0f}, b = {3.0f, 2.0f, 1.0f};

  std::cout << dotproduct(a, b) << std::endl;
  std::cin.get();
}

gcc バージョン 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)

4

1 に答える 1

3

テンプレート パラメーターの名前は、テンプレート パラメーター リストが対応するクラス (または関数) テンプレート内でのみ使用できます。それは理にかなっています-標準はテンプレートパラメーター名について保証しません。2 つの宣言間でも異なる場合があります。

検討:

template <typename U, typename T>
class A;

template <typename T, typename U>
class A
{ };

int main()
{
  A<int, char>::T some_variable; // which type parameter to use?
}

テンプレート パラメーターの名前を使用できないため、関数テンプレートがオーバーロード候補から削除され、他に関数がないため、オーバーロードの解決に失敗します (基本的に bluescarni が言ったこと)。

これを処理する正しい方法はtypedef、テンプレート名です。これを行うと、その名前はクラス/関数の外からでも使用できるようになります (そうでない限りprivate)。

例を修正するには、次のものが必要です。

template<class Element, size_t rows, size_t columns>
class matrix
{
public:
  typedef Element element_t;
private:
  element_t elements_[rows*columns];
  // ...
};
于 2011-06-06T09:05:35.700 に答える