2011-07-26 59 views
1

我正在研究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实际使用哪种实现方案?

+1

请显示完整的测试用例。 –

+0

“不起作用”是什么意思? –

+2

@Philipp: 构造函数参数不太可能影响 专业化的选择。你能发布错误信息吗? 我现在可以想到的原因是,变量定义被解析为 函数声明,该函数声明由于最令人兴奋的 解析而返回'MyClass '。 –

回答

2

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

没有,因为你告诉它要使用哪种类型:

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

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

1

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

但是你想有一个构造函数(这是一些部分),将参加在模板类型推演 - 这是不可能的。