2017-08-27 42 views
1

我是真的惭愧地问这个问题,但看起来我对模板一无所知。完全专用模板中构造函数的线外定义

所以我有这样的片段:

template <typename> class foo; 
class bar; 

template <> class foo <bar> 
{ 
public: 
    foo(); 
}; 

template <> foo <bar> :: foo() 
{ 
} 

哪里,好,我只是有一个模板类foo,一类bar,专业化foo <bar>有一个构造函数,我想定义构造出来的线。

尽管这个例子可能看起来很微不足道,但我无法得到它,我总是得到No function template matches function template specialization 'foo'

如果我添加一个虚拟参数,以便模板不是完全专用的(例如template <bool dummy> foo <bar, dummy> :: foo()),它可以很好地工作。我错过了什么?

+1

'模板<> FOO :: foo的()' - >'FOO :: foo的()'。你并没有专门化任何东西,你正在定义一个先前声明的实体。 – StoryTeller

+0

D'oh。它确实有道理。谢谢。 –

回答

1

可以使用普通成员定义语法定义完整类模板专业化的成员。这不是模板的定义,因此不能指定template<>前缀。

它只是改变

foo <bar> :: foo() 
{ 
}