c++ - 函数模板特化(以 int 值为模板)

标签 c++ templates

我正在使用 Eigen线性代数包,它们提供在维度上模板化的矩阵。我希望有一些函数可以为我的程序生成测试数据,因此我也尝试在维度上对它们进行模板化,并具有特定的特化:

template <size_t K>
boost::shared_ptr<std::vector<DistParams<K> > > sampleDistParams()
{
throw "not implemented";
}

template <size_t K>
boost::shared_ptr<std::vector<DistParams<K> > > sampleDistParams<1>()
{
boost::shared_ptr<std::vector<DistParams<K> > > distParams=(new std::vector<DistParams<K> >());
distParams->push_back(DistParams<K>(asMatrix(0.05), asMatrix(0.1)));
distParams->push_back(DistParams<K>(asMatrix(-0.1), asMatrix(0.2)));
return distParams;
}

template <size_t K>
boost::shared_ptr<std::vector<DistParams<K> > > sampleDistParams<2>()
{
boost::shared_ptr<std::vector<DistParams<K> > > distParams=(new std::vector<DistParams<K> >());
Eigen::Vector2d highMu;
lowMu << 0.04 << 0.06;
Eigen::Matrix2d lowSigma;
highSigma << 0.1 << 0.4
          << 0.4 << 0.12;

    Eigen::Vector2d lowMu;
lowMu << -0.08 << -0.12;
Eigen::Matrix2d highSigma;
highSigma << 0.2 << 0.7
          << 0.7 << 0.24;

distParams->push_back(DistParams<K>(highMu, lowSigma));
distParams->push_back(DistParams<K>(lowMu, highSigma));
return distParams;
}

但是,这些东西无法编译。我得到:

/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:24:73: error: template-id ‘sampleDistParams<1>’ in declaration of primary template
/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:24:53: error: redefinition of ‘template<unsigned int K> boost::shared_ptr<std::vector<DistParams<K> > > {anonymous}::sampleDistParams()’
/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:18:53: error: ‘template<unsigned int K> boost::shared_ptr<std::vector<DistParams<K> > > {anonymous}::sampleDistParams()’ previously declared here
/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:33:73: error: template-id ‘sampleDistParams<2>’ in declaration of primary template
/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:33:53: error: redefinition of ‘template<unsigned int K> boost::shared_ptr<std::vector<DistParams<K> > > {anonymous}::sampleDistParams()’
/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:18:53: error: ‘template<unsigned int K> boost::shared_ptr<std::vector<DistParams<K> > > {anonymous}::sampleDistParams()’ previously declared here

出了什么问题,我该如何解决?

最佳答案

如果你想特化一个函数模板,你不应该重新声明模板参数(注意你不能部分特化一个函数模板):

template<size_t K> void foo() { } // Primary template

template<size_t K> void foo<1>() { } // ERROR: Redefinition
template<> void foo<1>() { } // OK: Specialization

在您的特定情况下,模板特化的正确签名是:

template<>
boost::shared_ptr<std::vector<DistParams<1> > > sampleDistParams<1>()

另请注意,在 C++11 中,右尖括号 (>) 之间的空格不再是必需的。

关于c++ - 函数模板特化(以 int 值为模板),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14839333/

相关文章:

c++ - new() 和 delete() 作为 C++ 中的运算符?

C++ 只输出一位小数

c++ - C++ 中的 'operator' 错误不匹配

c++ - 从模板化父类中的派生内部类访问 protected 成员变量

C++模板类

c++ - 在模板类中实例化嵌套模板函数

c++ - 索拉里斯 10 : Alternative to dirfd()

c++ - 将消息格式化为不同的语言

c++ - 对专用模板成员的 undefined reference

python - Django 模板 : How to display block of HTML based on a boolean field in model