मैं माइक्रोसॉफ्ट C++ कम्पाइलर 14.1 (विजुअल स्टूडियो 2017) लेकिन मैं एक अजीब त्रुटि हो रही है पर एक पुस्तकालय संकलित करने के लिए कोशिश कर रहा हूँ एक वर्ग विधि के लिए एक अस्पष्ट कॉल की वजह से।यह सी ++ कोड केवल माइक्रोसॉफ्ट कंपाइलर पर एक संदिग्ध विधि कॉल क्यों है?
#include <iostream>
struct Event
{};
template<typename Derived>
struct State
{
public:
template<typename Fsm>
void onEvent(Fsm& fsm, const Event& event)
{
std::cout << "State::onEvent\n";
}
};
struct DerivedState
: State<DerivedState>
{
public:
using State::onEvent;
template<typename Fsm>
void onEvent(Fsm& fsm, const Event& event)
{
std::cout << "DerivedState::onEvent\n";
}
};
struct Context
{};
int main()
{
DerivedState ds;
Context context;
ds.onEvent(context, Event());
}
मैं निम्नलिखित उत्पादन प्राप्त:
1> C: \ Users \ pmas \ दस्तावेज \ दृश्य स्टूडियो
2017\projects\consoleapplication3\consoleapplication3\consoleapplication3.cpp(87): error C2668: 'DerivedState::onEvent': ambiguous call to overloaded function
1>c:\users\pmas\documents\visual studio 2017\projects\consoleapplication3\consoleapplication3\consoleapplication3.cpp(59): note: could be 'void DerivedState::onEvent<Context>(Fsm &,const Event &)'
1> with
1> [
1> Fsm=Context
1> ]
1>c:\users\pmas\documents\visual studio 2017\projects\consoleapplication3\consoleapplication3\consoleapplication3.cpp(45): note: or 'void State<DerivedState>::onEvent<Context>(Fsm &,const Event &)'
1> with
1> [
1> Fsm=Context
1> ]
1>c:\users\pmas\documents\visual studio 2017\projects\consoleapplication3\consoleapplication3\consoleapplication3.cpp(87): note: while trying to match the argument list '(Context, Event)'
कोड कुछ परीक्षण करने के बाद मैं निम्नलिखित कोड का टुकड़ा अलग-थलग मुझे पूरी तरह से कानूनी लग रहा है और जीसीसी, क्लैंग और आईसीसी पर ठीक संकलित करता है (और उम्मीद के अनुसार भी व्यवहार करता है)।
#include <iostream>
struct Event
{};
struct State
{
public:
template<typename Fsm>
void onEvent(Fsm& fsm, const Event& event)
{
std::cout << "State::onEvent\n";
}
};
struct DerivedState
: State
{
public:
using State::onEvent;
template<typename Fsm>
void onEvent(Fsm& fsm, const Event& event)
{
std::cout << "DerivedState::onEvent\n";
}
};
struct Context
{};
int main()
{
DerivedState ds;
Context context;
ds.onEvent(context, Event());
}
किसी को भी इस अंतर की व्याख्या कर सकते:
कुछ अतिरिक्त परीक्षण के बाद, मुझे लगता है कि कोड ठीक संकलित अगर मैं DerivedState
पाने में CRTP पैटर्न से बचने पता चला? क्या माइक्रोसॉफ्ट कंपाइलर मानक के अनुरूप नहीं है?