依赖于构造函数参数的模板类专门化?

时间:2011-07-26 10:19:50

标签: c++ templates template-specialization

我正在调查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实际使用了哪些实施方案?

2 个答案:

答案 0 :(得分:2)

  

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

不,因为您告诉它要使用哪种类型:

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

总是创建专门类型的对象。

答案 1 :(得分:1)

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

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