2016-11-18 25 views
2

のVisual Studioで提供し、次のコードは、Visual Studio 2015コミュニティでC2660エラーを与える:可変引数テンプレート関数を呼び出すと、エラーC2660が2015

class Logger { 
public: 
    template <class T> void writeLine(const T& value) { 
     if (this->filestream.is_open()) { 
      filestream << object << std::endl; 
     } 
    } 

    template <typename T> void write(const T& value) { 
     if (this->filestream.is_open()) { 
      filestream << value; 
     } 
    } 

    template <typename T, typename... Targs> void write(const T& value, const Targs&... args) { 
     if (this->filestream.is_open()) { 
      filestream << value; 
      this->write(args...); 
     } 
    } 

    // ... singleton stuff 
} 

私はこのような関数を呼び出しています:

#define LOG(x) Logger::instance().write(__FILE__, " (line ", __LINE__, "): ", x, std::endl); 

出力ログのエラーは次のとおりです。

encoder.cpp(51): error C2660: 'Logger::write': function does not take 6 arguments 

答えて

2

問題はですは、テンプレート

template< class CharT, class Traits > 
std::basic_ostream<CharT, Traits>& endl(std::basic_ostream<CharT, Traits>& os); 

は、そのための可能な解決策は、この問題に関する

var.write(__FILE__, " (line ", __LINE__, "): ", 22, std::endl<char, std::char_traits<char>>); 

詳しい情報here

1

std::endlはテンプレートで、コンパイラがするのに十分な情報を持っていない可能性があり、それ自体であります適切な専門分野を選択してください。これにはさまざまな方法があります。

  • 最後の引数(yuck)には、std::endl<char,std::char_traits<char>>を使用してください。
  • '\n'を使用してください。明らかに同等ではありませんが、おそらく動作します。
  • Logger::endlを作成して送信してください。

これらの後者のまともな例は、hereです。


無関係に、関係のない完全転送の使用を検討する必要があります。テンプレートメンバーを適応させるのは簡単なことです。 Advantages of using forward、およびリンク先の記事、The Forwarding Problem

template <typename T> 
void write(T&& value) { 
    if (this->filestream.is_open()) { 
     filestream << std::forward<T>(value); 
    } 
} 

template <typename T, typename... Args> 
void write(T&& value, Args&&... args) 
{ 
    this->write(std::forward<T>(value)); 
    this->write(std::forward<Args>(args)...); 
} 

はこちらを参照してください。

+0

私は 'std :: endl'が問題を起こしているとは考えていませんでした。私は最初のソリューションを使用し、それは完全に動作します。コードを転送するのに最適な理由は何ですか? –

+0

@AliAlidoust転送問題には多くの良い参考文献があり、どのように完全転送がそれに対処しているのですか。こちらを参照してください:[forward'を使うメリット](http://stackoverflow.com/questions/3582001/advantages-of-using-forward)、リンクされた記事[Forwarding Problem](http:// www。 open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm)。彼らは私ができるよりもはるかにそれを説明します。 – WhozCraig

関連する問題