首页 文章

使用带有std :: enable_if的模板,使用boost :: asio编译错误C2976

提问于
浏览
0

我写了一个c类,通过在测试程序中使用它可以正常工作 . 通过在我的项目中使用它,有一个编译错误C2976 . 所以我减少了代码以显示问题:

source.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 */

source.cpp

#include "source.h"

int main() {
   myNS::Dummy d;
   bool b = d.doSomething<bool>();
}

没有包含boost :: asio时没有编译错误 . 通过包含boost :: asio,编译器在最后一个模板定义上运行错误:

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.

有谁知道这个问题?这是MSVC的boost :: asio的错,还是我的错?在这个例子中,不需要包含boost :: asio,但在我的项目中我必须包含它 .
我正在使用MS Visual Studio Community 2017 V 15.5.5并使用boost库v1.66.0 .

谢谢!

1 回答

  • 0

    这有些不好 #define OUT ... (见Live Repro) .

    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 {};
    

相关问题