使用带有std::enable_的模板时,boost::asio出现编译错误C2976 我编写了C++类,在测试程序中使用它是很好的。在我的项目中使用它时,出现了一个编译错误C2976。因此,我减少了代码以显示问题:

使用带有std::enable_的模板时,boost::asio出现编译错误C2976 我编写了C++类,在测试程序中使用它是很好的。在我的项目中使用它时,出现了一个编译错误C2976。因此,我减少了代码以显示问题:,c++,templates,boost,enable-if,asio,C++,Templates,Boost,Enable If,Asio,来源:h #include <type_traits> //#include <boost/asio.hpp> namespace myNS { class Dummy { public: Dummy() {} ~Dummy() {} template<class T> struct _isValidType : std::false_type {}; template<> struct _isValidType<

来源:h

#include <type_traits>
//#include <boost/asio.hpp>

namespace myNS {

class Dummy {
public:
   Dummy() {}
   ~Dummy() {}

   template<class T> struct _isValidType : std::false_type {};
   template<> struct _isValidType<bool> : std::true_type {};
   template<> struct _isValidType<int> : std::true_type {};
   template<class T> struct isValidType : _isValidType<std::remove_cv_t<T>>::type {};

   template<typename OUT, typename std::enable_if<isValidType<OUT>::value>::type* dummy = nullptr>
   OUT doSomething() {  OUT out{}; return out; }
};

} /* namespace myNS */
有人知道这个问题吗?是MSVC的boost::asio的错,还是我的错?在本例中,boost::asio不是必须包含的,但在我的项目中,我必须包含它。 我正在与MS Visual Studio Community 2017 V 15.5.5合作,并使用boost library v1.66.0

谢谢

这是由一些错误的定义造成的。。。看

将OUT类型参数重命名为其他参数,并将显式专门化移到类之外

class Dummy {
public:
    // ...
    template<typename T, typename std::enable_if<isValidType<T>::value>::type* dummy = nullptr>
    T doSomething() {  T out{}; return out; }
}:

template<> struct Dummy::_isValidType<bool> : std::true_type {};
template<> struct Dummy::_isValidType<int> : std::true_type {};

如何调用doSomething?不能在类范围内显式专门化模板。将这些显式专门化移到名称空间范围。使用namespace@werner编译很好:谢谢你的回答,但还是一样的问题。不管它是在类之外还是在命名空间之外。@werner重命名为t或其他名称!问题解决了。如果我改为T或其他字符,效果很好。进进出出都不行。原因是什么?@werner我想它是从某些窗口发出的
source.h(14): error C2976: "Dummy::isValidType": Nicht genügend Vorlage-Argumente.
source.h(12): note: Siehe Deklaration von "Dummy::isValidType"
source.h(14): error C2955: "Dummy::isValidType" : Für die Verwendung von Klasse Vorlage ist eine Vorlage-Argumentliste erforderlich
source.h(12): note: Siehe Deklaration von "Dummy::isValidType"
source.h(15): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
class Dummy {
public:
    // ...
    template<typename T, typename std::enable_if<isValidType<T>::value>::type* dummy = nullptr>
    T doSomething() {  T out{}; return out; }
}:

template<> struct Dummy::_isValidType<bool> : std::true_type {};
template<> struct Dummy::_isValidType<int> : std::true_type {};