2

尝试编写模板函数时,我不断收到以下错误:

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

我搜索了错误并发现了其他一些情况,如果参数是浮点数或双精度数,非类型模板参数可能会出现问题。我使用非类型模板参数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

模板参数的名称只能在模板参数列表对应的类(或函数)模板内部使用。这是有道理的——标准不保证模板参数名称;即使在两个声明之间,它们也可能不同!

考虑:

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 回答