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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

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

Q&A

解決済

1回答

3202閲覧

【C++】エラー「C2244関数の定義を既存の宣言と合致させることができませんでした。」が出てしまう。

hota1024

総合スコア354

C++

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

0グッド

0クリップ

投稿2017/12/14 12:54

###前提・実現したいこと
siv3dでメニューを表示するクラスを作っています。
その中で以下のようなエラーが出てしまいます。

###発生している問題・エラーメッセージ

コード説明ファイル
C2244'Menu<ItemCode>::add':関数の定義を既存の宣言と合致させることができませんでしたmenu.cpp10
C2244'Menu<ItemCode>::update':関数の定義を既存の宣言と合致させることができませんでしたmenu.cpp16
C2244'Menu<ItemCode>::draw':関数の定義を既存の宣言と合致させることができませんでしたmenu.cpp26
C2955'Menu':クラステンプレートを使用するにはテンプレート引数リストが必要ですmain.cpp6

###該当のソースコード

Menu.h

1#pragma once 2#include <Siv3D.hpp> 3#include "Controller.h" 4 5template <class ItemCode> 6class Menu 7{ 8 Font font{ 16 }; 9 Array<ItemCode> items; 10 Array<String> text; 11public: 12 Menu& add(String text, ItemCode item); 13 14 void update(); 15 void draw(Vec2 pos) const; 16};

Menu.cpp

1#include "Menu.h" 2 3 4 5template <class ItemCode> 6Menu &Menu<ItemCode>::add(String text, ItemCode item) { 7 text.push_back(text); 8 items.push_back(item); 9 return *this; 10} 11 12 13template <class ItemCode> 14void Menu::update() { 15 16} 17 18 19template <class ItemCode> 20void Menu::draw(Vec2 pos) const { 21 for (size_t i = 0; i < text.size(); i++) 22 { 23 font(text[i]).draw(pos); 24 pos.y -= 32; 25 } 26}

###試したこと
MSDNなどで調べてみたのですがやはり直りませんでした。

###補足情報
環境はVisual studio 2015です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

MenuではなくMenu<ItemCode>と書く必要があります。

C++

1template <class ItemCode> 2Menu<ItemCode> &Menu<ItemCode>::add(String text, ItemCode item) { 3 text.push_back(text); 4 items.push_back(item); 5 return *this; 6}

クラス・テンプレート・メンバをクラス外で定義するのって難しいですよね。
msvcのエラーメッセージはテンプレートについては特に分かりにくいので頭痛いです。
そんな時、私はgcc(MinGW)を使ってます。比べると分かりやすいです。それはそれでたいへんですが。

クラス・テンプレートは、全てをヘッダで定義しない場合、使用する型全てについて明示的実体化が必要になりますから、可能な場合はクラス内定義した方が楽ですよ。

投稿2017/12/14 13:28

Chironian

総合スコア23272

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

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

hota1024

2017/12/14 13:36

回答ありがとうございます! 外部ファイルで定義するときにはそのように書くのは知りませんでした。 色々調べてみてVisual studioでgccを使えるのにはびっくりしました。 本当にありがとうございます。
Chironian

2017/12/14 13:54

おお、そうでした。gccというかclangですね。ちょっと古いバージョンのようですけどclangはエラーメッセージが分かりやすいと聞きますから、非常に有効と思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問