0

我正在尝试使用以下代码。

#include <iostream>
#include <vector>

using namespace std;

template <typename T, std::vector <T> myV>
int fun()
{
  cout <<" Inside fun () "<<endl;
}

int main( int argc, char ** argv)
{
  std::vector<int> a;
  fun<int,a>();
}

我不能通过 std::vector myV 吗?

但我可以使用模板 **fun()之类的东西来代替std::vector 。

4

2 回答 2

1

三角括号中的内容必须是类型或编译时常量;它不能是变量。虽然a's 的类型是vector<int>,但a它本身是一个类型的对象vector<int>;它不能作为模板参数之一放在三角括号中。

此外,您不能将vector<T>其用作模板函数的第二个类型参数:vector<T>是一种一旦您知道就会变得完全已知的类型T。由于您已经拥有T模板参数,因此您可以vector<T>在函数内“免费”声明,而无需额外的模板参数。

最后,在 C++11 中,您可以使用decltype. 例如,如果您修改代码以采用单个类型参数T,您可以这样做:

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
int fun()
{
  cout <<" Inside fun () "<<endl;
}

int main( int argc, char ** argv)
{
  std::vector<int> a;
  // This is the same as calling fun<std::vector<int> >();
  fun<decltype(a)>();
  return 0;
}

ideone 上的演示

于 2013-04-27T09:57:19.853 回答
0

你需要打电话

fun<int, std::vector<int>>();

它通过类型 std::vector<int>。如果要传递 的实例 ( a) std::vector<int>,则必须将函数定义更改为:

template<typename T>
int fun(std::vector<T> v)
{
    std::cout << "Inside fun()\n";
}

int main()
{
    std::vector<int> a;
    fun(a);
}
于 2013-04-27T09:54:43.337 回答