使默认构造函数模板化以避免Visual Studio中的早期模板实例化错误

时间:2012-12-08 07:10:01

标签: c++ visual-studio-2010 templates

我有一个课程,负责处理各种类型的有用任务和类似的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(它似乎是错误的位置)并且它没有默认构造函数来调用它的超级...

0 个答案:

没有答案