【发布时间】: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<int>。 -
正如@Ise Wisteria 所说,这可能是most vexing parse 问题。尝试用额外的括号将有问题的构造函数调用的参数括起来。
标签: c++ templates template-specialization