【问题标题】:Specializing Template Constructor Of Template Class模板类的特化模板构造函数
【发布时间】:2011-05-08 17:05:59
【问题描述】:

由于连续几周每天工作 14 小时,我的大脑已经融化了。

我有一个模板类,我正在尝试为这个类编写一个模板转换构造函数,并专门化该构造函数。编译器(MSVC9)对我很不满意。这是我正在尝试编写的实际代码的最小示例。编译器错误与代码内联。

帮助我解开我的大脑。我在这里需要什么语法来做我想做的事情?注意:在我的真实代码中,我必须在声明之外定义转换构造函数,所以这不是我的选择。

#include <string>
#include <sstream>
using namespace std;

template<typename A>
class Gizmo
{
public:
    Gizmo() : a_() {};
    Gizmo(const A& a) : a_(a) {};
    template<typename Conv> Gizmo(const Conv& conv) : a_(static_cast<A>(conv)) {};

private:
    A a_;
};

//
// ERROR HERE:
// " error C2039: 'Gizmo<B>' : is not a member of 'Gizmo<A>'"
//
template<> template<typename B> Gizmo<string>::Gizmo<typename B>(const B& b)
{
    stringstream ss;
    ss << b;
    ss >> a_;
}

int main()
{
    Gizmo<int> a_int;
    Gizmo<int> a_int2(123);
    Gizmo<string> a_f(546.0f);

    return 0;
}

【问题讨论】:

  • 为了以后的读者,我已经删除了原始问题中的虚假typename

标签: c++ templates template-specialization


【解决方案1】:
template<> template<typename B> Gizmo<string>::Gizmo(const B& b)

另请注意,const typename B&amp; 中的 typename 关键字必须删除。

【讨论】:

  • 我不知道它在 MSVC 上的情况如何,但如果不是 const B&amp; bg++ 将无法编译。
  • 我的大脑感谢你们!简单的代表,嗯?我只问简单的问题。 :)
  • @John:你应该时不时放松一下大脑。每天长时间暴露在 14 小时内可能有害。
  • 认为参数列表中的类型名实际上可能是非法的。
  • @Space_C0wb0y:最后期限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多