繁体   English   中英

在可变参数模板函数参数上编译错误

[英]compile error on variadic template function parameter

我正在尝试编写一些参数包装帮助程序代码,如下所示

#include <type_traits>
#include <string>

struct test{};

namespace ns {
    struct test{};
}

template<typename T>
struct arg_wrapper;

template<>
struct arg_wrapper<test>
{
    arg_wrapper(test&) {}
};

template<>
struct arg_wrapper<ns::test>
{
    arg_wrapper(ns::test&) {}
};

template<>
struct arg_wrapper<std::string>
{
    arg_wrapper(const std::string& value) {}
};

template<typename... Args>
void callee(const Args&... args)
{
}

template<typename... Args>
void wrapper_variadic(Args&&... args)
{
    callee(arg_wrapper<typename std::decay<Args>::type>(args)...);
}

template<typename Args>
void wrapper_fixed(Args&& args)
{
    callee(arg_wrapper<typename std::decay<Args>::type>(args));
}

int main()
{
    std::string a("test");
    wrapper_variadic(a); // works well
    wrapper_variadic(std::string("test")); // compile error
    wrapper_variadic(test()); // works well
    wrapper_variadic(ns::test()); // compile error
    wrapper_fixed(std::string("test")); // works well
    wrapper_fixed(test()); // works well
    wrapper_fixed(ns::test()); // works well
}

此代码适用于固定参数函数或没有命名空间的类型的l值ref,但我的编译器拒绝尝试将r值ref参数与某个命名空间一起使用。 我使用的是vc11 ctp版本,错误信息有点难以理解(见下文)

1>d:\work\toy\vs2012test\vs2012test\source.cpp(39): error C2065: 'basic_string<char,std::char_traits<char>,std::allocator<char> >' : undeclared identifier
1>          d:\work\toy\vs2012test\vs2012test\source.cpp(52) : see reference to function template instantiation 'void wrapper_variadic<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>(std::basic_string<char,std::char_traits<char>,std::allocator<char>> &&)' being compiled
1>d:\work\toy\vs2012test\vs2012test\source.cpp(39): error C2923: 'std::decay' : 'basic_string<char,std::char_traits<char>,std::allocator<char> >' is not a valid template type argument for parameter '_Ty'
1>d:\work\toy\vs2012test\vs2012test\source.cpp(39): error C2955: 'std::decay' : use of class template requires template argument list
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\type_traits(1620) : see declaration of 'std::decay'
1>d:\work\toy\vs2012test\vs2012test\source.cpp(39): error C2440: '<function-style-cast>' : cannot convert from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'arg_wrapper<_If<std::is_array<remove_reference<_Ty>::type>::value,remove_extent<remove_reference<_Ty>::type>::type*,_If<std::is_function<remove_reference<_Ty>::type>::value,add_pointer<remove_reference<_Ty>::type>::type,remove_cv<remove_reference<_Ty>::type>::type>::type>::type>'
1>          Source or target has incomplete type
1>d:\work\toy\vs2012test\vs2012test\source.cpp(39): error C2440: '<function-style-cast>' : cannot convert from 'ns::test' to 'arg_wrapper<test>'
1>          No constructor could take the source type, or constructor overload resolution was ambiguous
1>          d:\work\toy\vs2012test\vs2012test\source.cpp(54) : see reference to function template instantiation 'void wrapper_variadic<ns::test>(ns::test &&)' being compiled

它看起来像编译器错误,但我对此没有信心。 这个错误吗? 如果没有,那么我该怎么做才能解决问题呢?

它用g ++ 4.7.2和clang ++ 3.2编译得很好。 这可能是一个编译器错误。 似乎vc11没有正确实现扩展包。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM