2

我有一堂课,负责处理各种类型的有用任务,并像这种类型的行为一样。导入部分是该类如下所示:

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 的类(这似乎是错误的位置)并且它没有默认构造函数来调用其超级...

4

0 回答 0