【问题标题】:Explicit template specialization for constructor构造函数的显式模板特化
【发布时间】:2013-10-24 09:55:54
【问题描述】:

我有一个模板类,带有一个复制构造函数:

struct index_method {/*whatever*/};

template <class A, class B>
class ExampleClass
{
public:
   ExampleClass(void) {}
   template <class C>
   ExampleClass( const ExampleClass<A,C>& src_, const B& b_ = B() ) : _b(b_) { }
private:
   B _b;
};

以下模板构造函数特化已被 gcc 4.7.0 正确编译:

template <>
template <>
ExampleClass<double,index_method>::ExampleClass<index_method>( const ExampleClass<double,index_method>& src_, const index_method& b_ )
  : _b(b_)
{
}

但它在 MSVC 中存在问题:

error C2976: 'ExampleClass' : too few template arguments

基于另一个topic,我为MSVC尝试了一个更简单的代码:

ExampleClass<double,index_method>::ExampleClass<index_method>( const ExampleClass<double,index_method>& src_, const index_method& method_ )
  : _b(method_)
{
}

但它也不起作用。

有没有办法为 MSVC 2012 中的模板类指定模板复制构造函数?

【问题讨论】:

  • opalenzuela:很抱歉拒绝您的编辑,这是我的错。我做了建议的修改。非常感谢!
  • clang 3.2 也无法编译以下代码,但出现另一个错误。错误:“ExampleClass”的外线构造函数不能有模板参数
  • 下面的代码ideone.com/7vgtxt怎么样?
  • @ForEveR:它似乎有效。 (IntelliSense 不喜欢它,但谁在乎呢?)非常感谢! (您可以将其添加为答案吗?)

标签: c++ templates visual-c++ visual-studio-2012


【解决方案1】:

我不知道为什么会这样,因为 gcc 会编译它,但 clang 拒绝为 MSVC,但出现另一个错误。 但是,您可以简单地使用以下代码

struct index_method {/*whatever*/};

template <class A, class B>
class ExampleClass
{
public:
ExampleClass(void) {}
template <class C>
ExampleClass( const ExampleClass<A,C>& src_, const B& b_ = B() ) : _b(b_) { }
private:
B _b;
};

template <>
template <>
ExampleClass<double,index_method>::ExampleClass
( const ExampleClass<double,index_method>& src_, const index_method& b_ )
: _b(b_)
{
}

Example

【讨论】:

  • 仅当您为所有类型都定义了一个复制构造函数时才有效。如果您想为某些类型添加复制构造函数特化,您知道该怎么做吗? (使用 gcc 它工作得很好,但 clang 拒绝错误 - “对 '' 的限定引用是构造函数名称,而不是可以声明构造函数的类型”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2011-05-08
  • 2013-02-09
  • 2016-12-04
  • 2011-02-09
  • 2010-12-26
相关资源
最近更新 更多