【问题标题】:Template class specialization dependent on constructor arguments?依赖于构造函数参数的模板类专业化?
【发布时间】:2011-07-26 10:19:49
【问题描述】:

我正在调查 C++ 类模板的问题。一个类模板是专门化的,但编译器并不总是选择使用专门化。我发现构造函数参数似乎会影响这一点:

temlate <class T> 
class MyClass { /*some constructors*/ };

template<>
class MyClass <int>
{ void foo(); /*some constructors*/}

MyClass<int> test1; 
test1.foo(); //works

MyClass<int> test1("hallo"); 
test1.foo(); //doesn't work (foo does not exist, compiler uses unspecialized version.)

我还没有设法创建一个显示问题的示例,因为构造函数参数非常复杂(简单的参数不会出现问题)。

但我的问题很简单:构造函数参数是否可能影响编译器的选择?怎么样?

我正在使用 Visual C++ 2008。

非常感谢!

---- 编辑:

似乎我们已经发现了问题:如果模板特化不是我们构建的静态库中所有翻译单元的一部分,就会出现问题。但如果没有其他翻译单元,它就会消失。

我找到了http://codeidol.com/cpp/cpp-templates/Instantiation/Implementation-Schemes/,在我看来,通过贪婪实现,我们观察到的现象可以得到解释。

有人知道 MSVC 和 GCC 实际使用了哪些实现方案吗?

【问题讨论】:

  • 请显示完整的测试用例。
  • “不起作用”是什么意思?
  • @Philipp:构造函数参数不太可能影响专业化的选择。您可以发布错误消息吗?我现在能想到的原因是变量定义被解析为一个函数声明,由于最麻烦的解析,它返回MyClass&lt;int&gt;
  • 正如@Ise Wisteria 所说,这可能是most vexing parse 问题。尝试用额外的括号将有问题的构造函数调用的参数括起来。

标签: c++ templates template-specialization


【解决方案1】:

但我的问题很简单:有没有可能,那个构造函数 参数影响编译器的选择?怎么样?

不,因为你告诉它你想使用哪种类型:

MyClass<int> test1; 
test1.foo(); //works

总是在创建特殊类型的对象。

【讨论】:

    【解决方案2】:

    全局模板函数将是一个类型,编译器将使用函数参数进行类型推导。同样,类模板的“类型”参数将用作类的模板参数。

    但是你想要一个构造函数(它是一些 typepart)参与模板类型推导 - 这是不可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 2015-01-24
      • 1970-01-01
      • 2013-03-30
      • 2015-03-12
      • 1970-01-01
      相关资源
      最近更新 更多