2010-11-11 81 views
7

由于几个星期的14个小时的日子,我的大脑已经融化。模板类专用模板构造函数

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

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

#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; 
} 
+0

为了未来的读者,我在原始问题中删除了荒谬的'typename'。 – 2010-11-11 20:28:46

回答

7
template<> template<typename B> Gizmo<string>::Gizmo(const B& b) 

还要注意的是,从const typename B&typename关键字必须被删除。

+1

我不知道它是如何在MSVC上的,但'g ++'不会编译,如果它不是'const B&b'。 – kennytm 2010-11-11 20:18:45

+1

我的大脑谢谢你们两位!简单的代表,呃?我只问简单的问题。 :) – 2010-11-11 20:20:38

+1

@John:你应该在短时间内让自己的大脑松弛一些。长时间暴露于14小时可能有害。 – 2010-11-11 20:21:26