我有一个课程,负责处理各种类型的有用任务和类似的ACTS。导入部分是该类看起来像这样:
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似乎有一个早期模板实例化错误,并在实例化类时实例化默认构造函数(即使它没有被调用!)并导致权限错误或无方法-found-error(取决于Super)。
模板化构造函数不会发生此问题,因为它们在使用之前不会实例化。所以,我想用它来修复默认的构造函数。
请注意,所有这些代码在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(它似乎是错误的位置)并且它没有默认构造函数来调用它的超级...