質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1576閲覧

クラスのtemplate関数を利用する方法が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/06/25 05:59

編集2021/06/25 06:01

提示コードの//### 可変長引数 描画 ### なのですがこのテンプレート関数を使おうとすると未定義の外部参照というエラーが出るのですがこれはどうやれば正常利用することができるのでしょうか?

コンパイルエラー [ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK2019 未解決の外部シンボル "public: void __cdecl FrameWork::Text::Draw<int>(struct glm::vec<2,float,0>,char const *,unsigned short,struct glm::vec<4,float,0>,char const *,int const &)" (??$Draw@H@Text@FrameWork@@QEAAXU?$vec@$01M$0A@@glm@@PEBDGU?$vec@$03M$0A@@3@1AEBH@Z) が関数 main で参照されました FrameWork C:\Users\yw325\Desktop\ActionGame\FrameWork\FrameWork\Main.obj 1
] 

cpp

1text.Draw<int>(glm::vec2(100, 100), "Font/PressStart2P.ttf", 25, glm::vec4(0, 255, 0, 255), "Hello World ! {} ",42); 2

cpp

1#include "Text.hpp" 2 3#include "glew/include/GL/glew.h" 4#include "glm/glm.hpp" 5#include "uchar.h" 6#include "Window.hpp" 7#include "FrameWork.hpp" 8#include <iostream> 9#include <vector> 10#include <format> 11 12// ##################################### コンストラクタ ##################################### 13FrameWork::Text::Text() : FrameWork::Transform_2D() 14{ 15 16} 17 18// ##################################### 可変文字列 描画 ##################################### 19template <typename... Args> 20void FrameWork::Text::Draw(const glm::vec2 pos, const char* font, unsigned short pixel, const glm::vec4 color, const char* str, const Args&... args) 21{ 22 //マルチバイト文字をワイド文字変換 23 24 va_list args = NULL; 25 va_start(args, str); 26 std::string sr = std::format(str,args); 27 va_end(args); 28 29 std::cout << sr << std::endl; 30 31 //std::format(); 32 33 34 35 36 //フォントサイズ、フォント名を変更する時 37 38 39 if (NULL == font) 40 { 41 std::cout << "文字列がNULL" << std::endl; 42 43 fontName = std::string(DEFAULT_FONT); //既定フォント 44 pixelSize = pixel; //ピクセルサイズ 45 46 setFontName(fontName.c_str()); //フォント 47 setPixelSize(pixelSize); //ピクセルサイズ 48 49 50 charText = charText; 51 text = getTexture(getWchar_t(charText), fontName.c_str(), pixelSize, face); //テクスチャを生成 52 } 53 else if ( (pixelSize != pixel) || (fontName != std::string(font))) 54 { 55 std::cout << "フォントサイズ、フォント名を変更する時" << std::endl; 56 if (font == NULL) 57 { 58 fontName = std::string(DEFAULT_FONT); 59 } 60 else 61 { 62 fontName = font; 63 } 64 65 pixelSize = pixel; //ピクセルサイズ 66 67 setFontName(fontName.c_str()); //フォント 68 setPixelSize(pixelSize); //ピクセルサイズ 69 70 71 charText = charText; 72 text = getTexture(getWchar_t(charText), fontName.c_str(), pixelSize, face); //テクスチャを生成 73 } 74 else if( std::string(charText.data()) != std::string(charText.data()) ) 75 { 76 std::cout << "FixText" << std::endl; 77 FixText(text,getWchar_t(charText)); 78 charText = charText; 79 } 80 else 81 { 82 std::cout << "ああああ" << std::endl; 83 } 84 85 setTextSize(textSize, text); //文字列のサイズを取得 86 87 88 89 RenderCharacter(pos, pixelSize,color, text); //文字描画 90} 91 92// ##################################### テクスチャを生成 ##################################### 93std::vector<FrameWork::Text::Character> FrameWork::Text::getTexture(const std::vector<wchar_t> &text,const char* fontName, const unsigned short &pixelSize,FT_Face &face) 94{ 95 96} 97 98// ##################################### 文字列のサイズを設定 ##################################### 99void FrameWork::Text::setTextSize(glm::lowp_i16vec2 &size, const std::vector<Character> &character) 100{ 101} 102 103// ##################################### wchar_t型の文字列を取得 ##################################### 104std::vector<wchar_t> FrameWork::Text::getWchar_t(const std::vector<char> charText) 105{ 106 107} 108 109// ##################################### 文字列のサイズを取得 ##################################### 110glm::lowp_i16vec2 FrameWork::Text::getTextSize() 111{ 112 113} 114 115// ##################################### 文字列を描画 ##################################### 116void FrameWork::Text::RenderCharacter(glm::vec2 pos, const unsigned short &pixelSize,const glm::vec4 color,const std::vector<Character> &character) 117{ 118 119} 120 121 122// ##################################### 文字列修正 ##################################### 123void FrameWork::Text::FixText(std::vector<Character> &character, const std::vector<wchar_t>& newText) 124{ 125 126} 127 128// ##################################### ピクセルサイズ設定 ##################################### 129void FrameWork::Text::setPixelSize(unsigned short n) 130{ 131 132} 133 134// ##################################### フォント指定 ##################################### 135void FrameWork::Text::setFontName(const char* str) 136{ 137 138} 139 140 141// ##################################### デストラクタ ##################################### 142FrameWork::Text::~Text() 143{ 144 145}

cpp

1#ifndef ___TEXT_HPP_ 2#define ___TEXT_HPP_ 3#include "Transform_2D.hpp" 4//#include "Shader.hpp" 5#include "Help.hpp" 6 7#include "glm/glm.hpp" 8#include <map> 9#include "ft2build.h" 10#include FT_FREETYPE_H 11#include <vector> 12 13/*######################################################################### 14# 文字描画クラス 15 16説明 17 文字を描画する 18###########################################################################*/ 19 20#define DEFAULT_FONT "Font/SourceHanCodeJP.ttc" 21 22namespace FrameWork 23{ 24 class Window; 25 26 class Text : protected FrameWork::Transform_2D 27 { 28 29 public: 30 31 Text(); //コンストラクタ 32 ~Text(); //デストラクタ 33 34 template <typename... Args> 35 void Draw(const glm::vec2 pos,const char*font,unsigned short pixel,const glm::vec4 color, const char* str, const Args&... args); 36 glm::lowp_i16vec2 getTextSize(); //文字列のサイズ取得 37 38 39 private: 40 41 //文字構造体 42 struct Character 43 { 44 unsigned int textureID; //グリフのテクスチャID 45 glm::ivec2 size; //グリフサイズ 46 glm::ivec2 bearing; //グリフのベースライン 47 unsigned int advance; //次のグリフまでのオフセット 48 wchar_t character; //文字 49 }; 50 51 52 std::vector<Character> text; //文字列 53 std::vector<char> charText; //char型文字列 54 glm::lowp_i16vec2 textSize; //文字列のサイズ 55 unsigned short pixelSize; //ピクセルサイズ 56 std::string fontName; //フォント名 57 FT_Face face; //フェイス 58 59 std::vector<Character> getTexture(const std::vector<wchar_t>& text, const char* fontName, const unsigned short& fontSize, FT_Face& face); //テクスチャを生成 60 std::vector<wchar_t> getWchar_t(const std::vector<char> charText); //wchar_t型の文字列を取得 61 void setTextSize(glm::lowp_i16vec2 &size,const std::vector<Character> &character); //文字列のサイズを取得 62 void RenderCharacter(glm::vec2 pos, const unsigned short& FontSize, const glm::vec4 color, const std::vector<Character> &character); //文字列を描画 63 void FixText(std::vector<Character>& character, const std::vector<wchar_t>& newText); //文字列を修正 64 65 66 void setPixelSize(unsigned short n); //フォントサイズ設定 67 void setFontName(const char* str); //フォント設定 68 69 70 FT_Library ft; //freetype 71 }; 72} 73#endif

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

やっぱり言った通りじゃないか、templateを使うものの定義はそのファイル内で完結しないならばヘッダーファイルに書きましょう

投稿2021/06/25 06:04

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/06/25 06:18

これまで得られた山ほどの回答をことごとくガン無視するタイプ。つよい...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問