我有一堂课,负责处理各种类型的有用任务,并像这种类型的行为一样。导入部分是该类如下所示:
template <typename Super>
class Wrapper : public Super
{
public:
Wrapper ()
: Super ()
{ }
template <typename Arg1>
Wrapper ( Arg1 const & arg1 )
: Super ( arg1 )
{ }
// More like that...
} ;
这个想法是,如果您通常会调用:
MyClass1 * pObject1 = new MyClass1 ( "My String" ) ;
MyClass2 * pObject2 = new MyClass2 () ;
您可以改为致电:
MyClass1 * pObject1 = new Wrapper<MyClass1> ( "My String" ) ;
MyClass2 * pObject2 = new Wrapper<MyClass2> () ;
(注意:请不要质疑这样做的必要性。有必要。)
有时,Super 会有一个默认构造函数。有时它不会。但是 Wrapper 类总是一样的。
问题:Visual Studio 2010 似乎有一个早期模板实例化错误,并在实例化类时实例化默认构造函数(即使它没有被调用!)并导致权限错误或未找到方法-错误(取决于超级)。
模板化构造函数不会发生此问题,因为它们在使用之前肯定不会被实例化。所以,我想用它来修复默认构造函数。
请注意,所有这些代码在 GCC 4.2、GCC 4.1 和 LLVM 4.2.1 中都能完美运行。我什至让 cmake 从同一个 CMakeLists 文件生成 makefile、X-Code 项目文件和 VS2010 项目文件:两者都使用完全相同的代码(除了不使用这些类的次要低级抽象内容)。
我尝试过的一件事(不成功):
template <typename Super>
class Wrapper : public Super
{
public:
struct DummyStruct { } ;
template <typename Arg1>
Wrapper ( Arg1=int() , DummyStruct=DummyStruct() )
: Super ()
{ }
template <typename Arg1>
Wrapper ( Arg1 const & arg1 )
: Super ( arg1 )
{ }
// More like that...
} ;
VS2010 抱怨在 Wrapper 中找不到默认构造函数,尽管它没有告诉我在什么上下文中调用它。
任何有关如何强制 Wrapper 中的默认构造函数仅按需提供的建议(如,按照标准,它应该是)将不胜感激!谢谢!
更新/更多详情(2012 年 12 月 8 日 10.22 MST):
VS抱怨的特殊情况是这样的:
class MyGenericSuper
{
public:
MyGenericSuper ( std::string const & inOnlyArgument )
{ }
} ;
class MyClass : Wrapper<MyGenericSuper>
{
public:
MyClass ( std::string const & inOnlyArgument )
: Wrapper<MyGenericSuper> ( inOnlyArgument )
{ }
} ;
MyGenericSuper 的每个子类都具有完全相同的构造函数,并将其参数传递给 super。此外,它们只从抽象工厂实例化,所以我保证只使用一个参数创建它们(因为只有工厂创建它)。
此外,只有一个使用 Wrapper 的类(这似乎是错误的位置)并且它没有默认构造函数来调用其超级...