【发布时间】:2011-07-15 23:13:11
【问题描述】:
假设你有代码
template <template<class> class BaseType>
class EST16
: public BaseType<int>
{
public:
EST16(double d)
{
}
};
template <class T>
class SCEST
{
T y;
};
typedef EST16<SCEST> EST16_SC;
class Child
: public EST16_SC
{
public:
Child()
: EST16_SC(1.0)
{
}
};
class NotWorkingChild
: public EST16<SCEST>
{
public:
NotWorkingChild()
: EST16<SCEST>(1.0)
{
}
};
TEST(TemplateTest, TestInstantiate)
{
Child child;
NotWorkingChild notWorkingChild;
}
Child 和 NotWorkingChild 的区别仅在于 typedef。在 GCC 中都编译,在 Visual Studio 中 NotWorkingChild 的构造函数会产生以下错误:
2>..\..\..\src\itenav\test\SCKFErrorStateTest.cpp(43) : error C3200: 'SCEST<T>' : invalid template argument for template parameter 'BaseType', expected a class template
2> with
2> [
2> T=int
2> ]
你能解释一下为什么会这样吗?有没有比 typedef 更好的便携解决方案?
谢谢!
【问题讨论】:
-
您是否编写过任何实际实例化和使用模板类的代码?我的意思是,比如说,
main。可能发生的一件事是 VCC 在看到typedef时会测试实例化,而 GCC 在实际使用您的子类之一之前不会打扰。如果这是真的,那么一旦您实际编写使用子类模板之一的代码,您也会在 GCC 中遇到错误。 -
是的,我做到了。 TEST 宏创建了一个 Google 测试,它实际上是从 main() 调用的。
-
抱歉 --
TEST宏就在我的滚动截止之后,所以我错过了它。我不是 100% 为什么会失败,但我在下面发布了一种替代方法,它应该更易于跨编译器移植。在我看来,它也更具可读性:)
标签: c++ visual-studio templates gcc