1

我不明白为什么这不起作用:

template <typename T>
struct TypeWrapper
{
    typedef T type;
};
template <>
struct TypeWrapper<char*>
{
    typedef std::string type;
};
template <>
struct TypeWrapper<const char*>
{
    typedef std::string type;
};
template <int N>
struct TypeWrapper<char[N]>
{
    typedef std::string type;
};
template <int N>
struct TypeWrapper<const char[N]>
{
    typedef std::string type;
};

class A
{
public:
    template< typename T > 
    A( const typename TypeWrapper<T>::type& t )
    {
        // do smthing
        std::cout << t << std::endl;
    }
};

int main( void )
{
    A a( 42 );

    return 0;
}

我使用 Visual Studio 2010 进行编译,但出现以下错误:

error C2664: 'A::A(const A &)' : cannot convert parameter 1 from 'int' to 'const A &'

如果我将 A 的构造函数更改为此它可以工作:

A( const T& t )

但我想将 char* 类型处理为 std::strings 和可能的其他类型调整,而不复制构造函数(定义特定于每种类型的构造函数,这有效)

4

1 回答 1

2

我相信以下在语法上是不正确的

A( typename const TypeWrapper<T>::type& t )

它应该是

A( const typename TypeWrapper<T>::type& t )

或者

A( typename TypeWrapper<T>::type const& t )

无论如何,即使您解决了该问题,您的示例也不会编译。VC++ 试图调用(编译器生成的)复制构造函数,而不是你定义的构造函数,因为模板参数推导总是在你的构造函数上失败。原因是标准定义引用嵌套类型名称,如构造函数参数 ( typename TypeWrapper<T>::type) 中的嵌套类型名称是非推导上下文。

这使您无法构造A,因为必须推导出构造函数的模板参数;您不能明确指定它们。


您可能应该求助于超载。

class A
{
public:
    template< typename T > 
    A( T const& t )
    {
        // do smthing
        std::cout << t << std::endl;
    }

    A( std::string const& s )
    {
       std::cout << "string" << std::endl;
    }

    A ( char const *s )
    {
       std::cout << "char *" << std::endl;
    }

    template<std::size_t N>
    A ( const char (&arr)[N] )
    {
       std::cout << "char array" << std::endl;
    }
};
于 2013-09-16T19:04:10.807 回答