我正在调查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实际使用了哪些实施方案?
答案 0 :(得分:2)
但我的问题很简单:是否可能,那个构造函数 参数会影响编译器的选择吗?怎么样?
不,因为您告诉它要使用哪种类型:
MyClass<int> test1;
test1.foo(); //works
总是创建专门类型的对象。
答案 1 :(得分:1)
全局模板函数是一个类型,编译器将使用函数参数进行类型推导。类似地,类模板的“type”参数将用作类的模板参数。
但是你想要一个构造函数(某些类型的 part )参与模板类型推导 - 这是不可能的。